Project Name:
  • nxtactics
Version:
  • 0.1
Author:
Java Domain:
  • com.vxlisp
Description:
  • This is an implemenation of nexus tactics game rules.
Paths:
Libraries:
  • Name
    Lang
    Path
    javaniofile
    :java
    java.nio.file.*
    javafuture
    :java
    java.util.concurrent.CompletableFuture
    javafunction
    :java
    java.util.function.*
    javacollectors
    :java
    java.util.stream.Collectors
Commands:
  • Name
    Code
    Path
    Language
    Main
    Context
    Port
    Description
    doc
    :doc
    ../doc
    0
    Build documentation html
    webserver
    :webserver
    ..
    8081
    Run Simple Web Server
    srccpp
    :source
    ../cpp/src/main
    :cpp
    vx/core/main
    vx/translation/en/context-en
    0
    Build C++ Source Code
    testcpp
    :test
    ../cpp/src/test
    :cpp
    vx/translation/en/context-test
    0
    Build C++ Test Code
    srccsharp
    :source
    ../csharp/src/main
    :csharp
    vx/core/main
    vx/translation/en/context-en
    0
    Build C# Source Code
    testcsharp
    :test
    ../csharp/src/test
    :csharp
    vx/translation/en/context-test
    0
    Build C# Test Code
    srcjs
    :source
    ../js/src
    :js
    vx/core/main
    vx/translation/en/context-en
    0
    Build JavaScript Source Code
    testjs
    :test
    ../js/test
    :js
    vx/translation/en/context-test
    0
    Build JavaScript Test Code
    srcjava
    :source
    ../java/src/main/java
    :java
    nx/tactics/apptactics/main-nx
    nx/tactics/apptactics/context-nx
    0
    Build Java Source Code
    testjava
    :test
    ../java/src/test/java
    :java
    vx/translation/en/context-test
    0
    Build Java Test Code
    srckotlin
    :source
    ../kotlin/app/src/main/kotlin/app
    :kotlin
    vx/core/main
    vx/translation/en/context-en
    0
    Build Kotlin Source Code
    testkotlin
    :test
    ../kotlin/app/src/test/kotlin/app
    :kotlin
    vx/translation/en/context-test
    0
    Build Kotlin Test Code
    srcswift
    :source
    ../swift/src/main
    :swift
    vx/core/main
    vx/translation/en/context-en
    0
    Build Swift Source Code
    testswift
    :test
    ../swift/src/test
    :swift
    vx/translation/en/context-test
    0
    Build Swift Test Code
Packages:
  • vx/collection
  • vx/core
  • vx/data/csv
  • vx/data/db
  • vx/data/file
  • vx/data/table
  • vx/data/textblock
  • vx/data/tree
  • vx/data/xml
  • vx/event
  • vx/repl
  • vx/sample
  • vx/state
  • vx/test
  • vx/translate
  • vx/translation/all
  • vx/translation/en
  • vx/translation/es
  • vx/type
  • vx/web/html
  • vx/web/htmldoc
  • vx/web/http
  • nx/crypto/cryptosheet
  • nx/tactics/apptactics
  • nx/tactics/base
  • nx/tactics/books/advanced_rules
  • nx/tactics/books/age_of_sail
  • nx/tactics/books/age_of_steam
  • nx/tactics/books/bestiary
  • nx/tactics/books/bookloader
  • nx/tactics/books/characters
  • nx/tactics/books/combat
  • nx/tactics/books/core_rules
  • nx/tactics/books/gear
  • nx/tactics/books/gettingstarted
  • nx/tactics/books/giant_monsters
  • nx/tactics/books/horror
  • nx/tactics/books/land_sea_and_air
  • nx/tactics/books/magic
  • nx/tactics/books/medieval
  • nx/tactics/books/modern
  • nx/tactics/books/modern_fantasy
  • nx/tactics/books/prehistory
  • nx/tactics/books/pulp_fiction
  • nx/tactics/books/science_fiction
  • nx/tactics/books/skills
  • nx/tactics/books/space_and_time
  • nx/tactics/books/superheroes
  • nx/tactics/damage
  • vx/ui/appui
  • vx/ui/background
  • vx/ui/element
  • vx/ui/flow
  • vx/ui/image
  • vx/ui/navigation
  • vx/ui/scrollbar
  • vx/ui/text
  • vx/ui/textentry
  • vx/ui/ui
Source Code:
  • (project nxtactics :version "0.1" :author "" :doc "This is an implemenation of nexus tactics game rules." :projects "../../vxlisp/core/vxlisp" // :projects "../../vxlisp/vxlispruntime/vxlisp" :javadomain "com.vxlisp" :libs (lib javaniofile :path "java.nio.file.*" :lang :java) (lib javafuture :path "java.util.concurrent.CompletableFuture" :lang :java) (lib javafunction :path "java.util.function.*" :lang :java) (lib javacollectors :path "java.util.stream.Collectors" :lang :java) :cmds (cmd doc :code :doc :path ../doc :doc "Build documentation html") (cmd webserver :code :webserver :path .. :port 8081 :doc "Run Simple Web Server") (cmd srccpp :code :source :lang :cpp :path ../cpp/src/main :main vx/core/main :context vx/translation/en/context-en :doc "Build C++ Source Code") (cmd testcpp :code :test :lang :cpp :path ../cpp/src/test :context vx/translation/en/context-test :doc "Build C++ Test Code") (cmd srccsharp :code :source :lang :csharp :path ../csharp/src/main :main vx/core/main :context vx/translation/en/context-en :doc "Build C# Source Code") (cmd testcsharp :code :test :lang :csharp :path ../csharp/src/test :context vx/translation/en/context-test :doc "Build C# Test Code") (cmd srcjs :code :source :lang :js :path ../js/src :main vx/core/main :context vx/translation/en/context-en :doc "Build JavaScript Source Code") (cmd testjs :code :test :lang :js :path ../js/test :context vx/translation/en/context-test :doc "Build JavaScript Test Code") (cmd srcjava :code :source :lang :java :path ../java/src/main/java :main nx/tactics/apptactics/main-nx :context nx/tactics/apptactics/context-nx :doc "Build Java Source Code") (cmd testjava :code :test :lang :java :path ../java/src/test/java :context vx/translation/en/context-test :doc "Build Java Test Code") (cmd srckotlin :code :source :lang :kotlin :path ../kotlin/app/src/main/kotlin/app :main vx/core/main :context vx/translation/en/context-en :doc "Build Kotlin Source Code") (cmd testkotlin :code :test :lang :kotlin :path ../kotlin/app/src/test/kotlin/app :context vx/translation/en/context-test :doc "Build Kotlin Test Code") (cmd srcswift :code :source :lang :swift :path ../swift/src/main :main vx/core/main :context vx/translation/en/context-en :doc "Build Swift Source Code") (cmd testswift :code :test :lang :swift :path ../swift/src/test :context vx/translation/en/context-test :doc "Build Swift Test Code") )
vx/collection
Description:
  • Collection Package
Package Name:
  • vx/collection
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    type
    vx/type
Types:
Constants:
Functions:
  • any<-for-until-loop, any<-for-until-loop-max, any<-for-while-loop, any<-for-while-loop-max, is-list, is-map, list<-for-end-loop, list<-for-while-loop, list<-for-while-loop-max, list<-list-end, list<-list-filter, list<-list-filtertypes, list<-list-start, list<-list-start-end
Source Code:
  • (package vx/collection :libs (lib type :path vx/type) :doc "Collection Package") (func any<-for-until-loop : any-1 [start : any-1 fn-until : boolean<-any :: any-1 fn-loop : any<-any :: any-1 :: any-1] (any<-for-until-loop-max start fn-until fn-loop 10000) :test (test 8 (any<-for-until-loop 1 (fn : boolean [current : int] (> current 6)) (fn : int [current : int] (+ current current)))) :doc "Returns a value using an until loop. Maximum 10000 times.") (func any<-for-until-loop-max : any-1 [start : any-1 fn-until : boolean<-any fn-loop : any<-any :: any-1 :: any-1 max : int] (native :cpp "vx_core::Type_any any = vx_collection::vx_any_from_for_until_loop_max(generic_any_1, start, fn_until, fn_loop, max); output = vx_core::vx_any_from_any(generic_any_1, any);" :js "vx_collection.vx_any_from_for_until_loop_max(generic_any_1, start, fn_until, fn_loop, max)" :java :auto) :doc `Returns a value using a until loop. output : any-1 := start count : int := 0 (while continue continue : boolean := (count <= max) (if continue count += 1 output = (fn-loop output) continue = (fn-until output)))`) (func any<-for-while-loop : any-1 [start : any-1 fn-while : boolean<-any :: any-1 fn-loop : any<-any :: any-1 :: any-1] (any<-for-while-loop-max start fn-while fn-loop 1000) :test (test 8 (any<-for-while-loop 1 (fn : boolean [current : int] (< current 5)) (fn : int [current : int] (+ current current)))) :doc "Returns a value using a while loop. Maximum 1000 times.") (func any<-for-while-loop-max : any-1 [start : any-1 fn-while : boolean<-any :: any-1 fn-loop : any<-any :: any-1 :: any-1 max : int] (native :cpp "vx_core::Type_any any = vx_collection::vx_any_from_for_while_loop_max(generic_any_1, start, fn_while, fn_loop, max); output = vx_core::vx_any_from_any(generic_any_1, any);" :js "vx_collection.vx_any_from_for_while_loop_max(generic_any_1, start, fn_while, fn_loop, max)" :java :auto) :doc "Returns a value using a while loop. output : any-1 := start count : int := 0 (while continue continue : boolean := (count <= max) (if continue continue = (fn-while output) (if continue count += 1 output = (fn-loop output))))") (func is-list : boolean [val : any :doc "Any value"] (= ":list" (extends<-any val)) :test (test-true (is-list (empty stringlist))) :doc "Returns true if the given value is a list.") (func is-map : boolean [val : any :doc "Any value"] (= ":map" (extends<-any val)) :test (test-true (is-map (empty stringmap))) :doc "Returns true if the given value is a map.") (func list<-for-end-loop : list-1 [start : int end : int fn-loop : any<-int :: any-1] (native :cpp "vx_core::Type_any list = vx_collection::vx_list_from_for_end_loop(generic_list_1, start, end, fn_loop); output = vx_core::vx_any_from_any(generic_list_1, list);" :js "vx_collection.vx_list_from_for_end_loop(generic_list_1, start, end, fn_loop)" :java :auto) :test (test (intlist 4 9) (list<-for-end-loop : intlist 2 3 (fn [current : int] (* current current)))) :doc `Returns a list of any-1 by iterating i from for to next where each item is (loop i). This is similar to a for next loop in other languages. output : list-1 := (empty list-1) (if start <= end (for i=start to end val : any-1 := (fn-loop i) output += val) (else (for i=start to end; i-- val : any-1 := (fn-loop i) output += val) ))`) (func list<-for-while-loop : list-1 [start : any-1 fn-while : boolean<-any fn-loop : any<-any :: any-1 :: any-1] (list<-for-while-loop-max start fn-while fn-loop 1000) /* :test (test (intlist 1 2) (list<-for-while-loop : intlist 1 (fn : boolean [current : int] (< current 3)) (fn [current : int] (+1 current)))) */ :doc "Returns a list of any-1 using a while loop. Max: 1000") (func list<-for-while-loop-max : list-1 [start : any-1 fn-while : boolean<-any fn-loop : any<-any :: any-1 :: any-1 max : int] (native :cpp "vx_core::Type_any list = vx_collection::vx_list_from_for_while_loop_max(generic_list_1, start, fn_while, fn_loop, max); output = vx_core::vx_any_from_any(generic_list_1, list);" :js "vx_collection.vx_list_from_for_while_loop_max(generic_list_1, start, fn_while, fn_loop, max)" :java :auto) :doc `Returns a list of any-1 using a while loop. 1. output : list-1 := (empty list-1) 2. value : any-1 := start. 3. value : any-1 := (fn-loop value). 4. check : boolean := (fn-while value). 5. if (= check true) output := (copy output value), Go to 3 (Maximum max times). 6. else end.`) (func list<-list-end : list-1 [values : list-1 end : int] (list<-list-start-end values 1 end) :test (test (stringlist "a" "b" "c") (list<-list-end (stringlist "a" "b" "c" "d") 3)) :doc "Returns a sub list from positions 0 to end.") (func list<-list-filter : list-1 [vallist : list-2 fn-filter : any<-any] (native :cpp "vx_core::Type_any list = vx_collection::vx_list_from_list_filter(generic_list_1, vallist, fn_filter); output = vx_core::vx_any_from_any(generic_list_1, list);" :js "vx_collection.vx_list_from_list_filter(generic_list_1, vallist, fn_filter)" :java :auto) :test (test (stringlist "a1" "b1" "c1" "d1") (list<-list-filter : stringlist (list "a" 4 "b" (list) "c" (map) "d") (fn : string [val : any] (if (then (is-string val) (string val "1")))))) :doc "Filter List to only include non-empty values") (func list<-list-filtertypes : list-1 [vallist : list-2 filtertypes : typelist :...] (list<-list-filter vallist (fn : any [val : any] (if (is-type<-any-typelist val filtertypes) val))) :test (test (list "a" 1 "b" "c") (list<-list-filtertypes : list (list "a" 1 "b" "c" 4.5) string int)) :doc "Filter List to only include matching types") (func list<-list-start : list-1 [values : list-1 start : int] (list<-list-start-end values start (length<-list values)) :test (test (stringlist "b" "c" "d") (list<-list-start (stringlist "a" "b" "c" "d") 2)) :doc "Returns a sub list from start to list end.") (func list<-list-start-end : list-1 [values : list-1 start : int end : int] (native :cpp "vx_core::Type_any any = vx_collection::vx_list_from_list_start_end(generic_list_1, values, start, end); output = vx_core::vx_any_from_any(generic_list_1, any);" :js "vx_collection.vx_list_from_list_start_end(generic_list_1, values, start, end)" :java :auto) :test (test (stringlist "b" "c") (list<-list-start-end (stringlist "a" "b" "c" "d") 2 3)) :doc "Returns a list from another list")
vx/collection / any<-for-until-loop
Description:
  • Returns a value using an until loop. Maximum 10000 times.
Function Name:
  • any<-for-until-loop
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    start
    vx/core/any-1
    fn-until
    vx/core/boolean<-any
    fn-loop
    vx/core/any<-any
Usage/Test Cases:
  • (test 8 (any<-for-until-loop 1 (fn : boolean [current : int] (> current 6)) (fn : int [current : int] (+ current current))))
Source Code:
  • (func any<-for-until-loop : any-1 [start : any-1 fn-until : boolean<-any :: any-1 fn-loop : any<-any :: any-1 :: any-1] (any<-for-until-loop-max start fn-until fn-loop 10000) :test (test 8 (any<-for-until-loop 1 (fn : boolean [current : int] (> current 6)) (fn : int [current : int] (+ current current)))) :doc "Returns a value using an until loop. Maximum 10000 times.")
vx/collection / any<-for-until-loop-max
Description:
  • Returns a value using a until loop. output : any-1 := start count : int := 0 (while continue continue : boolean := (count <= max) (if continue count += 1 output = (fn-loop output) continue = (fn-until output)))
Function Name:
  • any<-for-until-loop-max
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    start
    vx/core/any-1
    fn-until
    vx/core/boolean<-any
    fn-loop
    vx/core/any<-any
    max
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func any<-for-until-loop-max : any-1 [start : any-1 fn-until : boolean<-any fn-loop : any<-any :: any-1 :: any-1 max : int] (native :cpp "vx_core::Type_any any = vx_collection::vx_any_from_for_until_loop_max(generic_any_1, start, fn_until, fn_loop, max); output = vx_core::vx_any_from_any(generic_any_1, any);" :js "vx_collection.vx_any_from_for_until_loop_max(generic_any_1, start, fn_until, fn_loop, max)" :java :auto) :doc `Returns a value using a until loop. output : any-1 := start count : int := 0 (while continue continue : boolean := (count <= max) (if continue count += 1 output = (fn-loop output) continue = (fn-until output)))`)
vx/collection / any<-for-while-loop
Description:
  • Returns a value using a while loop. Maximum 1000 times.
Function Name:
  • any<-for-while-loop
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    start
    vx/core/any-1
    fn-while
    vx/core/boolean<-any
    fn-loop
    vx/core/any<-any
Usage/Test Cases:
  • (test 8 (any<-for-while-loop 1 (fn : boolean [current : int] (< current 5)) (fn : int [current : int] (+ current current))))
Source Code:
  • (func any<-for-while-loop : any-1 [start : any-1 fn-while : boolean<-any :: any-1 fn-loop : any<-any :: any-1 :: any-1] (any<-for-while-loop-max start fn-while fn-loop 1000) :test (test 8 (any<-for-while-loop 1 (fn : boolean [current : int] (< current 5)) (fn : int [current : int] (+ current current)))) :doc "Returns a value using a while loop. Maximum 1000 times.")
vx/collection / any<-for-while-loop-max
Description:
  • Returns a value using a while loop. output : any-1 := start count : int := 0 (while continue continue : boolean := (count <= max) (if continue continue = (fn-while output) (if continue count += 1 output = (fn-loop output))))
Function Name:
  • any<-for-while-loop-max
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    start
    vx/core/any-1
    fn-while
    vx/core/boolean<-any
    fn-loop
    vx/core/any<-any
    max
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func any<-for-while-loop-max : any-1 [start : any-1 fn-while : boolean<-any :: any-1 fn-loop : any<-any :: any-1 :: any-1 max : int] (native :cpp "vx_core::Type_any any = vx_collection::vx_any_from_for_while_loop_max(generic_any_1, start, fn_while, fn_loop, max); output = vx_core::vx_any_from_any(generic_any_1, any);" :js "vx_collection.vx_any_from_for_while_loop_max(generic_any_1, start, fn_while, fn_loop, max)" :java :auto) :doc "Returns a value using a while loop. output : any-1 := start count : int := 0 (while continue continue : boolean := (count <= max) (if continue continue = (fn-while output) (if continue count += 1 output = (fn-loop output))))")
vx/collection / is-list
Description:
  • Returns true if the given value is a list.
Function Name:
  • is-list
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    val
    vx/core/any
    Any value
Usage/Test Cases:
  • (test-true (is-list (empty stringlist)))
Source Code:
  • (func is-list : boolean [val : any :doc "Any value"] (= ":list" (extends<-any val)) :test (test-true (is-list (empty stringlist))) :doc "Returns true if the given value is a list.")
vx/collection / is-map
Description:
  • Returns true if the given value is a map.
Function Name:
  • is-map
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    val
    vx/core/any
    Any value
Usage/Test Cases:
  • (test-true (is-map (empty stringmap)))
Source Code:
  • (func is-map : boolean [val : any :doc "Any value"] (= ":map" (extends<-any val)) :test (test-true (is-map (empty stringmap))) :doc "Returns true if the given value is a map.")
vx/collection / list<-for-end-loop
Description:
  • Returns a list of any-1 by iterating i from for to next where each item is (loop i). This is similar to a for next loop in other languages. output : list-1 := (empty list-1) (if start <= end (for i=start to end val : any-1 := (fn-loop i) output += val) (else (for i=start to end; i-- val : any-1 := (fn-loop i) output += val) ))
Function Name:
  • list<-for-end-loop
Return Type:
  • vx/core/list-1
Arguments:
  • Name
    Type
    Generic
    Description
    start
    vx/core/int
    end
    vx/core/int
    fn-loop
    vx/core/any<-int
Usage/Test Cases:
  • (test (intlist 4 9) (list<-for-end-loop : intlist 2 3 (fn [current : int] (* current current))))
Source Code:
  • (func list<-for-end-loop : list-1 [start : int end : int fn-loop : any<-int :: any-1] (native :cpp "vx_core::Type_any list = vx_collection::vx_list_from_for_end_loop(generic_list_1, start, end, fn_loop); output = vx_core::vx_any_from_any(generic_list_1, list);" :js "vx_collection.vx_list_from_for_end_loop(generic_list_1, start, end, fn_loop)" :java :auto) :test (test (intlist 4 9) (list<-for-end-loop : intlist 2 3 (fn [current : int] (* current current)))) :doc `Returns a list of any-1 by iterating i from for to next where each item is (loop i). This is similar to a for next loop in other languages. output : list-1 := (empty list-1) (if start <= end (for i=start to end val : any-1 := (fn-loop i) output += val) (else (for i=start to end; i-- val : any-1 := (fn-loop i) output += val) ))`)
vx/collection / list<-for-while-loop
Description:
  • Returns a list of any-1 using a while loop. Max: 1000
Function Name:
  • list<-for-while-loop
Return Type:
  • vx/core/list-1
Arguments:
  • Name
    Type
    Generic
    Description
    start
    vx/core/any-1
    fn-while
    vx/core/boolean<-any
    fn-loop
    vx/core/any<-any
Usage/Test Cases:
Source Code:
  • (func list<-for-while-loop : list-1 [start : any-1 fn-while : boolean<-any fn-loop : any<-any :: any-1 :: any-1] (list<-for-while-loop-max start fn-while fn-loop 1000) /* :test (test (intlist 1 2) (list<-for-while-loop : intlist 1 (fn : boolean [current : int] (< current 3)) (fn [current : int] (+1 current)))) */ :doc "Returns a list of any-1 using a while loop. Max: 1000")
vx/collection / list<-for-while-loop-max
Description:
  • Returns a list of any-1 using a while loop. 1. output : list-1 := (empty list-1) 2. value : any-1 := start. 3. value : any-1 := (fn-loop value). 4. check : boolean := (fn-while value). 5. if (= check true) output := (copy output value), Go to 3 (Maximum max times). 6. else end.
Function Name:
  • list<-for-while-loop-max
Return Type:
  • vx/core/list-1
Arguments:
  • Name
    Type
    Generic
    Description
    start
    vx/core/any-1
    fn-while
    vx/core/boolean<-any
    fn-loop
    vx/core/any<-any
    max
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func list<-for-while-loop-max : list-1 [start : any-1 fn-while : boolean<-any fn-loop : any<-any :: any-1 :: any-1 max : int] (native :cpp "vx_core::Type_any list = vx_collection::vx_list_from_for_while_loop_max(generic_list_1, start, fn_while, fn_loop, max); output = vx_core::vx_any_from_any(generic_list_1, list);" :js "vx_collection.vx_list_from_for_while_loop_max(generic_list_1, start, fn_while, fn_loop, max)" :java :auto) :doc `Returns a list of any-1 using a while loop. 1. output : list-1 := (empty list-1) 2. value : any-1 := start. 3. value : any-1 := (fn-loop value). 4. check : boolean := (fn-while value). 5. if (= check true) output := (copy output value), Go to 3 (Maximum max times). 6. else end.`)
vx/collection / list<-list-end
Description:
  • Returns a sub list from positions 0 to end.
Function Name:
  • list<-list-end
Return Type:
  • vx/core/list-1
Arguments:
  • Name
    Type
    Generic
    Description
    values
    vx/core/list-1
    end
    vx/core/int
Usage/Test Cases:
  • (test (stringlist "a" "b" "c") (list<-list-end (stringlist "a" "b" "c" "d") 3))
Source Code:
  • (func list<-list-end : list-1 [values : list-1 end : int] (list<-list-start-end values 1 end) :test (test (stringlist "a" "b" "c") (list<-list-end (stringlist "a" "b" "c" "d") 3)) :doc "Returns a sub list from positions 0 to end.")
vx/collection / list<-list-filter
Description:
  • Filter List to only include non-empty values
Function Name:
  • list<-list-filter
Return Type:
  • vx/core/list-1
Arguments:
  • Name
    Type
    Generic
    Description
    vallist
    vx/core/list-2
    fn-filter
    vx/core/any<-any
Usage/Test Cases:
  • (test (stringlist "a1" "b1" "c1" "d1") (list<-list-filter : stringlist (list "a" 4 "b" (list) "c" (map) "d") (fn : string [val : any] (if (then (is-string val) (string val "1"))))))
Source Code:
  • (func list<-list-filter : list-1 [vallist : list-2 fn-filter : any<-any] (native :cpp "vx_core::Type_any list = vx_collection::vx_list_from_list_filter(generic_list_1, vallist, fn_filter); output = vx_core::vx_any_from_any(generic_list_1, list);" :js "vx_collection.vx_list_from_list_filter(generic_list_1, vallist, fn_filter)" :java :auto) :test (test (stringlist "a1" "b1" "c1" "d1") (list<-list-filter : stringlist (list "a" 4 "b" (list) "c" (map) "d") (fn : string [val : any] (if (then (is-string val) (string val "1")))))) :doc "Filter List to only include non-empty values")
vx/collection / list<-list-filtertypes
Description:
  • Filter List to only include matching types
Function Name:
  • list<-list-filtertypes
Return Type:
  • vx/core/list-1
Arguments:
  • Name
    Type
    Generic
    Description
    vallist
    vx/core/list-2
    filtertypes
    vx/core/typelist
Usage/Test Cases:
  • (test (list "a" 1 "b" "c") (list<-list-filtertypes : list (list "a" 1 "b" "c" 4.5) string int))
Source Code:
  • (func list<-list-filtertypes : list-1 [vallist : list-2 filtertypes : typelist :...] (list<-list-filter vallist (fn : any [val : any] (if (is-type<-any-typelist val filtertypes) val))) :test (test (list "a" 1 "b" "c") (list<-list-filtertypes : list (list "a" 1 "b" "c" 4.5) string int)) :doc "Filter List to only include matching types")
vx/collection / list<-list-start
Description:
  • Returns a sub list from start to list end.
Function Name:
  • list<-list-start
Return Type:
  • vx/core/list-1
Arguments:
  • Name
    Type
    Generic
    Description
    values
    vx/core/list-1
    start
    vx/core/int
Usage/Test Cases:
  • (test (stringlist "b" "c" "d") (list<-list-start (stringlist "a" "b" "c" "d") 2))
Source Code:
  • (func list<-list-start : list-1 [values : list-1 start : int] (list<-list-start-end values start (length<-list values)) :test (test (stringlist "b" "c" "d") (list<-list-start (stringlist "a" "b" "c" "d") 2)) :doc "Returns a sub list from start to list end.")
vx/collection / list<-list-start-end
Description:
  • Returns a list from another list
Function Name:
  • list<-list-start-end
Return Type:
  • vx/core/list-1
Arguments:
  • Name
    Type
    Generic
    Description
    values
    vx/core/list-1
    start
    vx/core/int
    end
    vx/core/int
Usage/Test Cases:
  • (test (stringlist "b" "c") (list<-list-start-end (stringlist "a" "b" "c" "d") 2 3))
Source Code:
  • (func list<-list-start-end : list-1 [values : list-1 start : int end : int] (native :cpp "vx_core::Type_any any = vx_collection::vx_list_from_list_start_end(generic_list_1, values, start, end); output = vx_core::vx_any_from_any(generic_list_1, any);" :js "vx_collection.vx_list_from_list_start_end(generic_list_1, values, start, end)" :java :auto) :test (test (stringlist "b" "c") (list<-list-start-end (stringlist "a" "b" "c" "d") 2 3)) :doc "Returns a list from another list")
vx/core
Description:
  • Core vxlisp Library. Unfortunately large because of interdependencies.
Package Name:
  • vx/core
Libraries:
  • Name
    Path
    vx/test
    vx/test
    javafunction
    java.util.function.*
    javacollectors
    java.util.stream.Collectors
    javafuture
    java.util.concurrent.CompletableFuture
Types:
  • any, any-async<-func, any<-anylist, anylist, anymap, anytype, arg, arglist, argmap, boolean, booleanlist, collection, compilelanguages, connect, connectlist, connectmap, const, constdef, constlist, constmap, context, date, decimal, error, float, func, funcdef, funclist, funcmap, int, intlist, intmap, list, listtype, locale, map, maptype, mempool, msg, msgblock, msgblocklist, msglist, none, notype, number, numberlist, numbermap, package, packagemap, permission, permissionlist, permissionmap, project, security, session, setting, state, statelistener, string, stringlist, stringmap, struct, thenelse, thenelselist, translation, translationlist, translationmap, type, typedef, typelist, typemap, user, value
Constants:
  • false, global, infinity, mempool-active, msg-info, msg-warning, msg-error, msg-severe, neginfinity, newline, notanumber, nothing, quote, true
Functions:
  • ., +, +, +, +, +1, -, -, -, -, -1, *, *, *, *, /, =, =, ==, !, !=, !==, !-empty, !-empty, <, <, <=, <=, <-, <<-, >, >, >=, >=, allowfuncs<-security, allowtypenames<-typedef, allowtypes<-typedef, and, and, any<-any, any<-any-async, any<-any-context, any<-any-context-async, any<-any-key-value, any<-int, any<-func, any<-func-async, any<-key-value, any<-key-value-async, any<-list, any<-list-start-reduce, any<-list-start-reduce-next, any<-map, any<-map-start-reduce, any<-none, any<-none-async, any<-reduce, any<-reduce-async, any<-reduce-next, any<-reduce-next-async, any<-struct, async, boolean<-any, boolean<-func, boolean<-none, boolean-permission<-func, case, case, compare, contains, contains, context-main, copy, else, empty, extends<-any, extends<-typedef, first<-list, first<-list-any<-any, float<-string, fn, funcdef<-func, funcname<-funcdef, if, if, if, int<-func, int<-string, is-empty, is-empty, is-endswith, is-func, is-int, is-float, is-number, is-pass<-permission, last<-list, length<-list, let, let-async, list<-list, list<-list-async, list-join<-list, list<-map, list<-map-async, list<-type, log, log, main, map<-list, map<-map, mempool-addref, mempool-reserve, mempool-release, mempool-removeref, mempool-removerefchildren, msg<-error, msg<-error, msg<-error, msg<-warning, msgblock<-msgblock-msg, msgblock<-msgblock-msgblock, name<-typedef, native, native<-any, new, number<-func, or, or, package-global<-name, packagename<-typedef, path<-context-path, path<-setting-path, permission<-id-context, properties<-typedef, proplast<-typedef, resolve, resolve, resolve-async, resolve-first, resolve-list, security<-context, security<-user, session<-context, setting<-context, string-repeat, string<-any, string<-any-indent, string<-func, string<-string-find-replace, switch, then, traits<-typedef, type<-any, typedef<-any, typedef<-type, typename<-any, typename<-type, typename<-typedef, typenames<-typelist, user<-context
Source Code:
  • (package vx/core :libs (lib javafunction) (lib javacollectors) (lib javafuture) :doc "Core vxlisp Library. Unfortunately large because of interdependencies.") (type any :create (native :cpp "// :header vx_core::Type_any vx_type_from_any(vx_core::Type_any value) const;") :doc "Any Value for Variant Type") (type any-async<-func : func :allowfuncs [any<-func any<-func-async] :doc "A sync or async function that returns one value.") (type any<-anylist : list :allowfuncs [any<-any] :doc "List of any<-any") (type anylist : list :allowtypes [any] :doc "A list of any") (type anymap : map :allowtypes [any] :doc "A map of any") (type anytype : type :doc "Any Type that allows any Type as a Value") (type arg : struct :properties [name : string argtype : any fn-any : any<-func doc : string] :doc "A function argument") (type arglist : list :allowtypes [arg] :doc "A list of arg") (type argmap : map :allowtypes [arg] :doc "A map of arg") (type boolean :default false :allowvalues [true false] :create (native :cpp "// :header bool vx_p_boolean = false; bool vx_boolean() const;" :java "protected boolean vxboolean = false; @Override public boolean vx_boolean() {return vxboolean;}") :test (test-true true) (test-false false) (test-true (boolean true)) (test-false (boolean false)) :doc "Standard Boolean Type") (type booleanlist : list :allowtypes [boolean]) (type collection :allowtypes [list map]) (type compilelanguages :default :unknown :allowvalues [:unknown :cpp :csharp :java :js :kotlin :swift]) (type connect :doc "General connect trait") (type connectlist : list :allowtypes [connect] :doc "List of connect") (type connectmap : map :allowtypes [connect] :doc "Map of connect") (type const : const :doc "Original Constant Class.") (type constdef : struct :properties [pkgname : string name : string type : any] :doc "Const Definition Class for inspecting properties.") (type constlist : list :allowtypes [any] :doc "List of Const.") (type constmap : map :allowtypes [any] :doc "Map of Const.") (type context : struct :properties [code : string session : session setting : setting state : state] :doc "Context") (type date : string :doc "A simple UTC date.") (type decimal :traits [number] :default 0 :create (native :cpp "// :header std::string vx_p_decimal = “0.0”; float vx_float() const; std::string vx_string() const;" :java "protected String vxdecimal = “0.0”; @Override public float vx_float() { return Float.parseFloat(vxdecimal); } @Override public String vx_string() {return vxdecimal;} @Override public Type_decimal vx_new_from_string(final String sval) { Class_decimal output = new Class_decimal(); output.vxdecimal = sval; return output; }") :doc "A clean version of float like Java BigDecimal.") (type error :doc "Error Type") (type float :default 0.0 :traits [number] :create (native :cpp "// :header float vx_p_float = 0; float vx_float() const;" :java "protected float vxfloat = 0; @Override public float vx_float() {return vxfloat;}") :test (test 4.5 (float 4.5)) :doc "Standard Floating Point Number") (type func : func :create (native :cpp "// :header vx_core::Type_funcdef vx_funcdef() const;") :doc "Original Function Class.") (type funcdef : struct :properties [pkgname : string name : string idx : int type : any async : boolean] :create (native :cpp "// :header static vx_core::Type_funcdef vx_funcdef_new( std::string pkgname, std::string name, long idx, bool async, vx_core::Type_any typ );") :doc "Func Definition Class for inspecting properties.") (type funclist : list :allowtypes [func] :doc "List of Func.") (type funcmap : map :allowtypes [func] :doc "Map of Func.") (type int :default 0 :allowvalues [infinity neginfinity] :traits [number] :create (native :cpp "// :header long vx_p_int = 0; long vx_int() const;" :java "protected int vxint = 0; @Override public int vx_int() {return vxint;}") :test (test-true (is-int 4)) (test-true (is-int "4")) (test-true (is-int infinity)) (test-true (is-int neginfinity)) (test-true (is-int notanumber)) (test-false (is-int "a")) (test-false (is-int 5.5)) :doc "A simple integer.") (type intlist : list :allowtypes [int] :doc "A list of int.") (type intmap : map :allowtypes [int] :doc "A map of int.") (type list : list :allowtypes [any] :create (native :cpp "// :header vx_core::vx_Type_listany vx_p_list; vx_core::vx_Type_listany vx_list() const; vx_core::Type_any vx_get_any(vx_core::Type_int index) const; vx_core::Type_any vx_new_from_list(vx_core::vx_Type_listany listval) const;") :doc "A simple untyped list.") (type listtype : type :doc "A generic type that extends :list.") (type locale : struct :doc "Localization data.") (type map : map :allowtypes [any] :create (native :cpp "// :header std::vector<std::string> vx_p_keys; vx_core::vx_Type_mapany vx_p_map; vx_core::vx_Type_mapany vx_map() const; vx_core::Type_any vx_get_any(vx_core::Type_string key) const; vx_core::Type_any vx_new_from_map(vx_core::vx_Type_mapany mapval) const;") :doc "A simple untyped map.") (type maptype : type :doc "A generic type that extends :map.") (type mempool : struct :properties [valuepool : value] :create (native :java "private int vx_max = 20; private Map<String, Deque<Core.Type_any>> vx_maplistany = new ConcurrentHashMap<>(); @Override public <T extends Core.Type_any> T vx_restore(final T generic_any_1) { T output = null; String typename = Core.f_typename_from_any(generic_any_1).vx_string(); Deque<Core.Type_any> listany = this.vx_maplistany.get(typename); if (listany == null) { } else if (!listany.isEmpty()) { Core.Type_any any = listany.remove(); if (any != null) { output = Core.f_any_from_any(generic_any_1, any); } } return output; } @Override public void vx_recycle(final Core.Type_any addany) { String typename = Core.f_typename_from_any(addany).vx_string(); Deque<Core.Type_any> listany = this.vx_maplistany.get(typename); boolean isdestroy = true; int imax = this.vx_max; if (imax == 0) { } else if (listany == null) { isdestroy = false; listany = new ConcurrentLinkedDeque<Core.Type_any>(); listany.add(addany); this.vx_maplistany.put(typename, listany); } else { int ilen = listany.size(); if (ilen < imax) { listany.add(addany); } } if (isdestroy) { // destroy } } @Override public void vx_recyclelist(final List<Core.Type_any> addlistany) { for (Core.Type_any addany : addlistany) { this.vx_recycle(addany); } }") :doc "Memory Pool") (type msg : struct :properties [code : string :doc "Message Code" detail : any :doc "Message Detail" path : string :doc "Message Path" severity : int :doc "Message Severity" text : string :doc "Message Text"] :create (native :cpp "// :header std::exception err;" :java "public Exception err = null;") :doc "Message Type for error handling") (type msgblock : struct :properties [msgs : msglist msgblocks : msgblocklist] :create (native :java "public Type_msgblock vx_msgblock_from_copy_arrayval(final Core.Type_any copy, final Object... vals) { Core.Type_msgblock output = Core.e_msgblock; Core.Type_msgblock copymsgblock = copy.vx_msgblock(); if (copymsgblock != null) { output = copymsgblock; } return output; }") :doc "Block of Messages") (type msgblocklist : list :allowtypes [msgblock] :doc "List of Message Blocks") (type msglist : list :allowtypes [msg] :doc "List of Messages") (type none :doc "No Type. No type is returned at all. e.g. Void") (type notype :doc "No Type that allows no Types as a Value") (type number :default 0 :allowtypes [int float decimal] :doc "A generic number that could be int, float, or decimal.") (type numberlist : list :allowtypes [number] :doc "A list of number.") (type numbermap : map :allowtypes [number] :doc "A map of number.") (type package : struct :properties [pkgname : string constmap : constmap funcmap : funcmap typemap : typemap emptymap : map] :doc "A package that store types, consts and funcs.") (type packagemap : map :allowtypes [package]) (type permission : struct :properties [id : string] :doc "Permission") (type permissionlist : list :allowtypes [permission] :doc "List of Permission") (type permissionmap : map :allowtypes [permission] :doc "Map of Permission") (type project : struct :properties [packagemap : packagemap] :doc "A project.") (type security : struct :properties [allowfuncs : funclist permissions : permissionlist permissionmap : permissionmap] :doc "Security rules") (type session : struct :properties [user : user connectlist : connectlist connectmap : connectmap locale : locale translation : translation translationmap : translationmap] :doc "Session") (type setting : struct :properties [pathmap : stringmap] :doc "Settings") (type state : map :allowtypes [statelistener]) (type statelistener : struct :properties [path : string value : any fn-boolean : boolean<-none]) (type string : string :default "" :create (native :cpp "// :header std::string vx_p_string = “”; std::string vx_string() const;" :java "protected String vxstring = “”; @Override public String vx_string() { return vxstring; }") :test (test "a" (string "a")) (test "ab" (string "a" "b")) :doc "A simple string.") (type stringlist : list :allowtypes [string] :doc "A list of string.") (type stringmap : map :allowtypes [string] :doc "A map of string.") (type struct : struct :create (native :cpp "// :header vx_core::vx_Type_mapany vx_map() const; vx_core::Type_any vx_get_any(vx_core::Type_string key) const;") :doc "Struct is the type of all structures/objects with properties.") (type thenelse : struct :properties [code : string value : any values : list fn-cond : boolean<-func fn-any : any<-func]) (type thenelselist : list :allowtypes [thenelse]) (type translation : struct :properties [name : string wordmap : stringmap] :doc "i18 language translation.") (type translationlist : list :allowtypes [translation] :doc "i18 language translation list.") (type translationmap : map :allowtypes [translation] :doc "i18 language translation map.") (type type : type :doc "Original Type Class") (type typedef : struct :properties [pkgname : string name : string extends : string allowfuncs : funclist allowtypes : typelist allowvalues : anylist disallowfuncs : funclist disallowtypes : typelist disallowvalues : anylist properties : argmap proplast : arg traits : typelist] :create (native :cpp "// :header static vx_core::Type_typedef vx_typedef_new( std::string pkgname, std::string name, std::string extend, vx_core::Type_typelist traits, vx_core::Type_typelist allowtypes, vx_core::Type_typelist disallowtypes, vx_core::Type_funclist allowfuncs, vx_core::Type_funclist disallowfuncs, vx_core::Type_anylist allowvalues, vx_core::Type_anylist disallowvalues, vx_core::Type_argmap properties );") :doc "Type Definition Class for inspecting Type properties.") (type typelist : list :allowtypes [any] :doc "List of Types") (type typemap : map :allowtypes [any] :doc "Map of Any Type Class") (type user : struct :properties [security : security username : string token : string] :doc "User Type") (type value : struct :properties [next : any refs : int]) (const false : boolean :test (test-false false)) (const global : project :doc "Global variable for project data.") (const infinity : int (native :js "Infinity") :doc "Infinity. Returned during unusual calculations.") (const mempool-active : mempool :doc "Active Value Memory Pool") (const msg-info : int 0 :doc "Message is just information") (const msg-warning : int 1 :doc "Message is a Warning") (const msg-error : int 2 :doc "Message is an Error") (const msg-severe : int 3 :doc "Message is a Severe Error") (const neginfinity : int (native :js "-Infinity") :doc "Negative Infinity. Returned during unusual calculations.") (const newline : string "\n" :doc "New line constant") (const notanumber : int (native :js "NaN") :doc "Not a number. Returned during invalid calculations.") (const nothing : string "nothing" :doc "Nothing Value. Opposite of every other value. e.g. Nil, Null") (const quote : string `"` :doc "Quotation mark constant") (const true : boolean (native :cpp "true" :js "true" :java "true") :test (test-true true)) (func . : any [object : any method : string params : anylist :...] (native :js "object[method].apply(params)") :alias "dotmethod" :sideeffects "Depends on object" :doc "Not Recommened: Support for Object Oriented dot notation. e.g. (this.foo 'a') = this.foo('a')") (func + : int [num1 : int num2 : int] (native :cpp "long result = num1->vx_int() + num2->vx_int(); output = vx_core::vx_new_int(result);" :js "num1 + num2" :java "int result = num1.vx_int() + num2.vx_int(); output = Core.vx_new_int(result);") :alias "plus" :test (test 5 (+ 2 3)) (test 3 (+ 5 -2)) :doc "Math int plus") (func + : number [num1 : number num2 : number] (native :cpp "float result = vx_core::vx_float_from_number(num1) + vx_core::vx_float_from_number(num2); output = vx_core::vx_new_float(result);" :js "num1 + num2" :java "Core.Type_float float1 = Core.t_float.vx_new(num1); Core.Type_float float2 = Core.t_float.vx_new(num2); float result = float1.vx_float() + float2.vx_float(); output = Core.vx_new_float(result);") :alias "plus" :test (test 5 (+ 2 3)) (test 3 (+ 5 -2)) :doc "Math number plus") (func + : int [nums : intlist :...] (any<-list-start-reduce nums 0 (fn : int [total : int num : int] (+ total num))) :alias "plus" :doc "Math int plus") (func + : number [nums : numberlist :...] (any<-list-start-reduce nums 0 (fn : number [total : number num : number] (+ total num))) :alias "plus" :doc "Math number plus") (func +1 : int [num : int] (+ num 1) :alias "plus1" :test (test 3 (+1 2)) (test -1 (+1 -2)) :doc "Math int plus 1") (func - : int [num1 : int num2 : int] (native :cpp "long result = num1->vx_int() - num2->vx_int(); output = vx_core::vx_new_int(result);" :js "num1 - num2" :java "int result = num1.vx_int() - num2.vx_int(); output = Core.vx_new_int(result);") :alias "minus" :test (test 1 (- 3 2)) (test 7 (- 5 -2)) :doc "Math int minus") (func - : number [num1 : number num2 : number] (native :cpp "float result = vx_core::vx_float_from_number(num1) - vx_core::vx_float_from_number(num2); output = vx_core::vx_new_float(result);" :js "num1 - num2" :java "Core.Type_float float1 = Core.t_float.vx_new(num1); Core.Type_float float2 = Core.t_float.vx_new(num2); float result = float1.vx_float() - float2.vx_float(); output = Core.vx_new_float(result);") :alias "minus" :test (test 5 (+ 2 3)) (test 3 (+ 5 -2)) :doc "Math number minus") (func - : int [nums : intlist :...] (any<-list-start-reduce nums 0 (fn : int [total : int num : int] (- total num))) :alias "minus" :doc "Math integer minus") (func - : number [nums : numberlist :...] (any<-list-start-reduce nums 0 (fn : number [total : number num : number] (- total num)) ) :alias "minus" :doc "Math number minus") (func -1 : int [num : int] (- num 1) :alias "minus1" :test (test 1 (-1 2)) (test -3 (-1 -2)) :doc "Math int minus 1") (func * : int [num1 : int num2 : int] (native :cpp "long result = num1->vx_int() * num2->vx_int(); output = vx_core::vx_new_int(result);" :js "num1 * num2" :java "int result = num1.vx_int() * num2.vx_int(); output = Core.vx_new_int(result);") :alias "multiply" :test (test 6 (* 3 2)) (test -10 (* 5 -2)) :doc "Math int multiply") (func * : number [num1 : number num2 : number] (native :cpp "float result = vx_core::vx_float_from_number(num1) * vx_core::vx_float_from_number(num2); output = vx_core::vx_new_float(result);" :js "num1 * num2" :java "Core.Type_float float1 = Core.t_float.vx_new(num1); Core.Type_float float2 = Core.t_float.vx_new(num2); float result = float1.vx_float() * float2.vx_float(); output = Core.vx_new_float(result);") :alias "multiply" :test (test 6.4 (* 3.2 2)) (test -10.2 (* 5.1 -2)) :doc "Math multipy") (func * : int [nums : intlist :...] (any<-list-start-reduce nums 1 (fn : int [total : int num : int] (* total num)) ) :alias "multiply" :test (test 24 (* 3 2 4)) (test -20 (* 5 -2 2)) :doc "Math multiply") (func * : number [nums : numberlist :...] (any<-list-start-reduce nums 1 (fn : number [total : number num : number] (* total num)) ) :alias "multiply" :test (test 24 (* 3 2 4)) (test -20 (* 5 -2 2)) :doc "Math multiply") (func / : number [num1 : number num2 : number] (native :cpp "float float1 = vx_core::vx_float_from_number(num1); float float2 = vx_core::vx_float_from_number(num2); if (float1 == 0) { } else if (float2 == 0) { output = vx_core::c_notanumber; } else { float result = float1 / float2; output = vx_core::vx_new_float(result); }" :js "num1 / num2" :java "Core.Type_float float1 = Core.t_float.vx_new(num1); Core.Type_float float2 = Core.t_float.vx_new(num2); if (float1.vx_float() == 0) { } else if (float2.vx_float() == 0) { output = Core.c_notanumber; } else { float result = float1.vx_float() / float2.vx_float(); output = Core.vx_new_float(result); }") :alias "divide" :test (test 3 (/ 6 2)) (test -5 (/ 10 -2)) :doc "Math divide") (func = : boolean [val1 : any val2 : any] (native :cpp "bool isequal = false; if (val1 == val2) { isequal = true; } else { std::string str1 = vx_core::vx_string_from_any(val1); std::string str2 = vx_core::vx_string_from_any(val2); if (str1 == str2) { isequal = true; } } output = vx_core::vx_new_boolean(isequal);" :js "vx_core.vx_eq(val1, val2)" :java "boolean isequal = false; if (val1 == val2) { isequal = true; } else { Core.Type_string strval1 = Core.f_string_from_any(val1); Core.Type_string strval2 = Core.f_string_from_any(val2); if (strval1.vx_string().equals(strval2.vx_string())) { isequal = true; } } output = Core.vx_new_boolean(isequal);") :alias "eq" :test (test-true (= true true)) (test-true (= 2 2)) (test-true (= "a" "a")) (test-true (= (stringlist "a" "b" "c") (new stringlist "a" "b" "c"))) (test-true (= (stringmap :a "1" :b "2") (new stringmap :a "1" :b "2"))) :doc "Boolean equal/equivalent") (func = : boolean [values : anylist :...] (any<-list-start-reduce-next : boolean values false (fn : boolean [reduce : boolean current : any next : any] (and reduce (= current next))) ) :alias "eq" :test (test-false (= 2 2 3)) :doc "Boolean equal/equivalent") (func == : boolean [val1 : any val2 : any] (native :cpp "bool isequal = vx_core::vx_eqeq(val1, val2); output = vx_core::vx_new_boolean(isequal);" :js "output = val1 == val2" :java "boolean isequal = Core.vx_eqeq(val1, val2); output = Core.vx_new_boolean(isequal);") :alias "eqeq" :test (test-true (== 0 0)) (test-true (== "" "")) :doc "Strict equality check. Note that all non-empty, non-constants will not be equal.") (func ! : boolean [val : boolean :doc "Thing to not"] (native :cpp "vx_core::vx_new_boolean(!val->vx_boolean());" :js "!val" :java "Core.vx_new_boolean(!val.vx_boolean());") :alias "not" :test (test-false false) (test-false (! true)) :doc "Boolean not") (func != : boolean [val1 : any val2 : any] (! (= val1 val2)) :alias "ne" :test (test-ne true false) (test-ne "a" "b") :doc "Returns true if the first arg is not equal to any of the other arg.") (func !== : boolean [val1 : any val2 : any] (! (== val1 val2)) :alias "neqeq" :doc "Returns true if the first arg is not strictly equal to any of the other arg.") (func !-empty : boolean [text : string] (! (is-empty text)) :alias "notempty" :doc "Returns true if text is not empty.") (func !-empty : boolean [val : any] (! (is-empty val)) :alias "notempty" :doc "Returns true if val is not empty.") (func < : boolean [val1 : any val2 : any] (switch (compare val1 val2) (case -1 true) (else false)) :alias "lt" :test (test-true (< 2 3)) :doc "Returns true if the first arg is less than all of the other args") (func < : boolean [values : anylist :...] (any<-list-start-reduce-next : boolean values true (fn : boolean [reduce : boolean current : any next : any] (and reduce (< current next))) ) :alias "lt" :test (test-true (< 2 3)) (test-true (< "b" "d" "z")) :doc "Returns true if the first arg is less than all of the other args") (func <= : boolean [val1 : any val2 : any] (! (> val1 val2)) :alias "le" :test (test-true (<= 2 3)) :doc "Returns true if the first arg is less or equal than all of the other args") (func <= : boolean [args : anylist :...] (! (> args)) :alias "le" :test (test-true (<= "b" "d" "z")) :doc "Returns true if the first arg is less or equal than all of the other args") (func <- : any-1 [value : any-1 fnlist : any<-anylist :...] :alias chainfirst :test (test (* (+ (- 5 3) 3) 2) (<- 5 (- 3) (+ 3) (* 2))) :doc "This is a special function that applies a value as the first argument for the first function. The result is then used as the first argument on the next function, etc. Sometimes this improves readability.") (func <<- : any-1 [value : any-1 fnlist : any<-anylist :...] :alias chainlast :test (test (* (+ (- 3 5) 3) 2) (<<- 5 (- 3) (+ 3) (* 2))) :doc "This is a special function that applies a value as the last argument for the first function. The result is then used as the last argument on the next function, etc. Sometimes this improves readability.") (func > : boolean [val1 : any val2 : any] (switch (compare val1 val2) (case 1 true) (else false)) :alias "gt" :test (test-true (> 3 2)) :doc "Returns true if the first arg is greater than all of the other args") (func > : boolean [values : anylist :...] (any<-list-start-reduce-next : boolean values true (fn : boolean [reduce : boolean current : any next : any] (and reduce (> current next))) ) :alias "gt" :test (test-true (> "z" "y" "b")) :doc "Returns true if the first arg is greater than all of the other args") (func >= : boolean [val1 : any val2 : any] (! (< val1 val2)) :alias "ge" :test (test-true (>= 3 2)) :doc "Returns true if val1 is greater or equal to val2") (func >= : boolean [args : anylist :...] (! (< args)) :alias "ge" :test (test-true (>= "z" "b" "b")) :doc "Returns true if the first arg is greater or equal than all of the other args") (func allowfuncs<-security : funclist [security : security] (:allowfuncs security) :doc "Returns allowfuncs from a given security.") (func allowtypenames<-typedef : stringlist [vtypedef : typedef] (typenames<-typelist (allowtypes<-typedef vtypedef)) :doc "Return allow name list from type") (func allowtypes<-typedef : typelist [vtypedef : typedef] (native :cpp "vtypedef->allowtypes();" :js "vtypedef['vx_value']['allowtypes']" :java "vtypedef.allowtypes();") :doc "Return allow type list from type") (func and : boolean [val1 : boolean val2 : boolean] (native :cpp "if (val1->vx_boolean() && val2->vx_boolean()) { output = vx_core::c_true; } else { output = vx_core::c_false; }" :js "if (val1 && val2) { output = true } else { output = false }" :java "if (val1.vx_boolean() && val2.vx_boolean()) { output = Core.c_true; } else { output = Core.c_false; }") :test (test-true (and true true)) (test-false (and true false)) :doc "Returns true if all values are true") (func and : boolean [values : booleanlist :...] (switch : boolean (length<-list values) (case 0 true) (case 1 (:1 values)) (else (any<-list-start-reduce-next : boolean values true (fn : boolean [reduce : boolean current : boolean next : boolean] (and reduce (and current next))) ))) :test (test-true (and true true true)) (test-false (and true true false)) :doc "Returns true if all values are true") (func any<-any : any-1 [value : any-2] (native :cpp "output = vx_core::vx_any_from_any(generic_any_1, value);" :js "value" :java "@SuppressWarnings(“unchecked”) output = (T)value;") :doc "Function Type taking any value any-2 and returning generic any-1") (func any<-any-async : any-1 [value : any-2] :async :doc "Function Type taking any value any-2 and returning generic any-1") (func any<-any-context : any-1 [value : any-2] (native :java "@SuppressWarnings(“unchecked”) output = (T)value;") :context :doc "Function Type taking any value any-2 and returning generic any-1 using context") (func any<-any-context-async : any-1 [value : any-2] :async :context :doc "Generic Function taking any value any-2 and returning generic any-1") (func any<-any-key-value : any-1 [current : any-1 key : string value : any-2] :doc "Generic Function returning Generic any-1 from a any-1, a key, and a value.") (func any<-int : any-1 [value : int] :doc "Generic Function returning Generic any-1 from an int") (func any<-func : any-1 [] :doc "Generic Function returning Generic any-1 with any parameters") (func any<-func-async : any-1 [] :async :doc "Generic Function returning Generic any-1 with any parameters") (func any<-key-value : any-1 [key : string val : any-2] :doc "Generic Function returning Generic any-1 from a key and a value") (func any<-key-value-async : any-1 [key : string val : any-2] :async :doc "Generic Function returning Asynchronous Generic any-1 from a key and a value") (func any<-list : any-1 [values : list-1 index : int] (native :cpp "long intindex = index->vx_int(); vx_core::vx_Type_listany listvalue = values->vx_list(); long intsize = vx_core::vx_int_from_sizet(listvalue.size()); if (intindex <= intsize) { vx_core::Type_any value = listvalue[intindex - 1]; output = vx_core::vx_any_from_any(generic_any_1, value); }" :js "if (index <= values.length) { output = values[index - 1] }" :java "int intindex = index.vx_int(); int intsize = values.vx_list().size(); if (intindex <= intsize) { List<Core.Type_any> listvalue = values.vx_list(); Core.Type_any value = listvalue.get(intindex - 1); output = Core.f_any_from_any(generic_any_1, value); }") :test (test "b" (any<-list (list "a" "b" "c") 2)) (test "b" (:2 (stringlist "a" "b" "c"))) :doc "Returns nth value from a list or none if out of bounds") (func any<-list-start-reduce : any-1 [list : list-2 valstart : any-1 fn-reduce : any<-reduce] (native :cpp "vx_core::Type_any work = valstart; std::vector<vx_core::Type_any> listval = list->vx_list(); for (vx_core::Type_any item : listval) { work = fn_reduce->vx_any_from_reduce(work, item); }; output = vx_core::vx_any_from_any(generic_any_1, work);" :js "output = valstart const fn = fn_reduce['vx_value'] if (fn) { for (const item of list) { output = fn(output, item) } }" :java "output = valstart; List<Core.Type_any> listval = list.vx_list(); for (Core.Type_any item : listval) { output = fn_reduce.vx_any_from_reduce(generic_any_1, output, item); }") :test (test 24 (any<-list-start-reduce : int (intlist 3 2 4) 1 (fn : int [total : int num : int] (* total num)))) :doc "Returns a val from a list reduce operation") (func any<-list-start-reduce-next : any-1 [list : list-2 valstart : any-1 fn-reduce-next : any<-reduce-next] (native :cpp "vx_core::Type_any result = vx_core::vx_any_from_list_result_next(generic_any_1, list, valstart, fn_reduce_next); output = vx_core::vx_any_from_any(generic_any_1, result);" :js "output = valstart const fn = fn_reduce_next['vx_value'] if (fn) { let current = vx_core.e_any let first = true for (const next of list) { if (first) { first = false } else { output = fn(output, current, next) } current = next } }" :java "output = valstart; final List<Core.Type_any> listval = list.vx_list(); Core.Type_any current = Core.e_any; boolean first = true; for (final Core.Type_any next : listval) { if (first) { first = false; } else { output = fn_reduce_next.vx_any_from_reduce_next(generic_any_1, output, current, next); } current = next; }") :doc "Returns a val from a list reduce operation") (func any<-map : any-1 [valuemap : map-1 key : string] (native :cpp "vx_core::Type_any val = valuemap->vx_get_any(key); output = vx_core::vx_any_from_any(generic_any_1, val);" :js "if (key.startsWith(':')) { key = key.substring(1) } const mapval = valuemap['vx_value'] let val = mapval[key] if (val != undefined) { output = val }" :java "Core.vx_any_from_map(generic_any_1, valuemap, key);") :test (test "v2" (any<-map (map :a "v1" :b "v2" :c "v3") :b)) :doc "Returns value from a map or empty if not found") (func any<-map-start-reduce : any-1 [map : map-1 start : any-1 fn-reduce : any<-any-key-value :: any-1 :: any-1] (native :cpp :auto :java :auto :js :auto) :test (test "xayb" (any<-map-start-reduce (stringmap :a "x" :b "y") "" (fn : string [current : string key : string value : any] (copy current value key)))) :doc "Returns a value by reducing each element of a map.") (func any<-none : any-1 [] :doc "Function Type returning Generic any-1 with no parameters") (func any<-none-async : any-1 :async [] :doc "Function Type returning Generic any-1 with no parameters") (func any<-reduce : any-1 [result : any-1 item : any-2]) (func any<-reduce-async : any-1 :async [result : any-1 item : any-2]) (func any<-reduce-next : any-1 [result : any-1 current : any-2 next : any-2]) (func any<-reduce-next-async : any-1 :async [result : any-1 current : any-2 next : any-2]) (func any<-struct : any-1 [vstruct : struct-2 key : string] (native :cpp "vx_core::Type_any val = vstruct->vx_get_any(key); output = vx_core::vx_any_from_any(generic_any_1, val);" :js "const subvalmap = vstruct['vx_value'] if (subvalmap != undefined) { if (key.startsWith(':')) { key = key.substring(1) } const val = subvalmap[key] if (val != undefined) { output = val } }" :java "Core.Type_any val = vstruct.vx_any(key); output = Core.f_any_from_any(generic_any_1, val);") :doc "Returns value from a struct") (func async : any-1 :async [value : any-1] (native :js "value" :java "output = Core.async_new_completed(value);") :doc "Returns an asynchonous version value. This exists mostly for type-casting.") (func boolean<-any : boolean [value : any-1] :doc "Function Type taking generic any-1 and returning boolean") (func boolean<-func : boolean [] :doc "Function Type returning boolean with any parameters") (func boolean<-none : boolean [] :doc "Function Type returning boolean with no parameters") (func boolean-permission<-func : boolean [func : func] (contains (allowfuncs<-security (security<-context)) func) :context :doc "Returns true if the given func has permission.") (func case : thenelse [values : list-1 fn-any : any<-func] (thenelse :code :casemany :values values :fn-any fn-any)) (func case : thenelse [value : any-1 fn-any : any<-func] (thenelse :code :case :value value :fn-any fn-any)) (func compare : int [val1 : any val2 : any] (native :cpp "long intresult = vx_core::vx_compare(val1, val2); output = vx_core::vx_new_int(intresult);" :js "if (val1 == val2) { output = 0 } else if (val1 < val2) { output = -1 } else { output = 1 }" :java "int intresult = 0; if ((val1 instanceof Core.Type_number) && (val2 instanceof Core.Type_number)) { Core.Type_number num1 = (Core.Type_number)val1; Core.Type_number num2 = (Core.Type_number)val2; float float1 = Core.t_float.vx_new(num1).vx_float(); float float2 = Core.t_float.vx_new(num2).vx_float(); if (float1 < float2) { intresult = -1; } else if (float1 > float2) { intresult = 1; } } else { String stringval1 = Core.f_string_from_any(val1).vx_string(); String stringval2 = Core.f_string_from_any(val2).vx_string(); int compare = stringval1.compareTo(stringval2); if (compare > 0) { intresult = 1; } else if (compare < 0) { intresult = -1; } } output = Core.vx_new_int(intresult);") :test (test 1 (compare 3 2)) (test 1 (compare "z" "a")) :doc "Returns 0 if vals are equal, 1 if val1 > val2, -1 if val1 < val2") (func contains : boolean [text : string find : string] (native :cpp "bool check = vx_boolean_from_string_find(text->vx_string(), find->vx_string()); output = vx_core::vx_new_boolean(check);" :js "vx_core.vx_boolean_from_string_find(text, find)" :java "boolean check = vx_boolean_from_string_find(text.vx_string(), find.vx_string()); output = Core.vx_new_boolean(check);") :test (test-true (contains "abcde" "cd")) (test-false (contains "abcde" "dc")) :doc "Returns true if the given list contains the given value.") (func contains : boolean [values : list-2 :doc "Any list" find : any :doc "Any value"] (native :cpp "bool booleanresult = false; vx_core::vx_Type_listany listvalues = values->vx_list(); for (vx_core::Type_any item : listvalues) { vx_core::Type_boolean iseq = vx_core::f_eq(item, find); if (iseq->vx_boolean()) { booleanresult = true; break; } } output = vx_core::vx_new_boolean(booleanresult);" :js "values.includes(find)" :java "boolean booleanresult = false; List<Core.Type_any> listvalues = values.vx_list(); for (Core.Type_any item : listvalues) { Core.Type_boolean iseq = Core.f_eq(item, find); if (iseq.vx_boolean()) { booleanresult = true; break; } } output = Core.vx_new_boolean(booleanresult);") :test (test-true (contains (stringlist "1" "2" "3") "2")) (test-true (contains (intlist 1 2 3) 2)) (test-false (contains (list 1 "2" 3) 2)) :doc "Returns true if the given list contains the given value.") (func context-main : context [args : anylist :...] (context) :doc "Returns the default context for app main execution. Arguments come from the command line.") (func copy : any-1 [value : any values : anylist :...] (native :cpp "T* output = vx_core::vx_copy(generic_any_1, value, values->vx_list());" :js "vx_core.f_new(value, ...values)" :java "@SuppressWarnings(“unchecked”) Core.Type_any[] arrayany = Core.arrayany_from_anylist(values); Object[] arrayobj = (Core.Type_any[])arrayany; T output = (T)(value.vx_copy(arrayobj));") :bigospace :n :bigotime :n :test (test (stringmap :a "1" :b "2") (copy (stringmap :a "1") :b "2")) :doc "Returns a copy of a given value with the given values added or updated.") (func else : thenelse [fn-any : any<-func] (thenelse :code :else :fn-any fn-any)) (func empty : any-1 [type : any-1] (native :cpp "T* output = vx_core::vx_any_from_any(type, type->vx_empty());" :js "vx_core.vx_empty(type)" :java "@SuppressWarnings(“unchecked”) T output = (T)(type.vx_empty());") :test (test "" (empty string)) (test (list) (empty list)) (test (map) (empty map)) :doc "Returns the empty value for a given type. Can be called using (empty type) or simply (type)") (func extends<-any : string [val : any-1] (extends<-typedef (typedef<-any val))) (func extends<-typedef : string [vtypedef : typedef] (:extends vtypedef) :doc "Get the basetype of a given type") (func first<-list : any-1 [values : list-1] (any<-list values 1) :doc "Returns first value" :test (test "b" (first<-list (stringlist "b" "c")))) (func first<-list-any<-any : any-1 [values : list-1 fn-any<-any : any<-any] (native :cpp "std::vector<vx_core::Type_any> listvalue = values->vx_list(); for (vx_core::Type_any value : listvalue) { if (value != vx_core::c_nothing) { vx_core::Type_any any = fn_any_from_any->vx_any_from_any(value); output = vx_core::vx_any_from_any(generic_any_1, any); break; } }" :js "output = " nothing " const fn = fn_any_from_any['vx_value'] if (fn) { for (let index=0;index < values.length;index++) { output = fn(generic, values[index]) if (output != " nothing ") { break } } }" :java "List<Core.Type_any> listvalue = values.vx_list(); for (Core.Type_any value : listvalue) { if (value != Core.c_nothing) { output = fn_any_from_any.vx_any_from_any(generic_any_1, value); break; } }") :doc "Returns first value that is not nothing" :test (test "b" (first<-list-any<-any (list nothing "b" "c") resolve))) (func float<-string : float [text : string] (native :cpp "float num = vx_core::vx_float_from_string(text->vx_string()); output = vx_core::vx_new_float(num);" :js "vx_core.vx_float_from_string(text);" :java "float num = Core.vx_float_from_string(text.vx_string()); output = Core.vx_new_float(num);") :test (test (float 2.3) (float<-string "2.3")) :doc "Returns float from a given string.") (func fn : any-1 [params : arglist fn-any : any<-func] :doc "Shell for lambda function calls") (func funcdef<-func : funcdef [val : func] (native :cpp "val->vx_funcdef();" :java "val.vx_funcdef();")) (func funcname<-funcdef : string [funcdef : funcdef] (string (:pkgname funcdef) "/" (:name funcdef)) :doc "Get the name of a given funcdef") (func if : any-1 [clause : boolean then : any-1] (native :cpp "if (clause->vx_boolean()) { output = then; }" :js "if (clause) { output = then }" :java "if (clause.vx_boolean()) { output = then; }") :test (test "a" (if (= 2 2) "a")) (test "" (if : string (= 1 2) "a")) :doc "Logical If function") (func if : any-1 [clause : boolean thenval : any-1 elseval : any-1] (native :cpp "if (clause->vx_boolean()) { output = thenval; } else { output = elseval; }" :js "if (clause) { output = thenval } else { output = elseval }" :java "if (clause.vx_boolean()) { output = thenval; } else { output = elseval; }") :test (test "a" (if (= 2 2) "a" "b")) (test "b" (if (= 1 2) "a" "b")) :doc "Logical If function") (func if : any-1 [thenelselist : thenelselist :...] (native :cpp "vx_core::Type_any any = vx_core::vx_if_thenelselist(generic_any_1, thenelselist); output = vx_core::vx_any_from_any(generic_any_1, any);" :js "let fn_any = null for (const thenelseval of thenelselist) { const thenelse = thenelseval['vx_value'] const code = thenelse['code'] switch (code) { case ':then': const fn_cond = thenelse['fn-cond'] const fn = fn_cond['vx_value'] const cond = fn() if (cond == true) { fn_any = thenelse['fn-any'] } break case ':else': fn_any = thenelse['fn-any'] break } if (fn_any != null) { const fn = fn_any['vx_value'] output = fn() break } }" :java "Core.Func_any_from_func fn_any = Core.Class_list.vx_any_first_from_list_fn(Core.t_any_from_func, thenelselist, (any) -> { Core.Func_any_from_func fnany = null; if (any instanceof Core.Type_thenelse) { Core.Type_thenelse thenelse = (Core.Type_thenelse)any; Core.Type_string code = thenelse.code(); switch (code.vx_string()) { case “:then”: Core.Func_boolean_from_func fn_cond = thenelse.fn_cond(); Core.Type_boolean cond = fn_cond.vx_boolean_from_func(); if (cond.vx_boolean() == true) { fnany = thenelse.fn_any(); } break; case “:else”: fnany = thenelse.fn_any(); break; } } return fnany; }); if (fn_any != null) { output = fn_any.vx_any_from_func(generic_any_1); }") :doc "Logical If function" :test (test-true (if (then (= 2 3) false) (then (!= 3 3) false) (else (! false))))) (func int<-func : int [] :doc "Function Type returning int with any parameters") (func int<-string : int [val : string] (switch : int val (case "notanumber" notanumber) (case "infinity" infinity) (case "neginfinity" neginfinity) (else (native :cpp "// :capture val vx_core::Type_int intresult = vx_core::e_int; try { std::string sval = val->vx_string(); long ival = std::stoll(sval); intresult = vx_core::vx_new_int(ival); } catch (std::exception ex) { intresult = vx_core::c_notanumber; } return intresult;" :js "parseInt(val)" :java "int intresult = 0; String strval = val.vx_string(); try { float floatresult = Float.parseFloat(strval); intresult = (int)floatresult; return Core.vx_new_int(intresult); } catch (Exception ex) { return Core.c_notanumber; }" ) ) ) :test (test 4 (int<-string "4")) (test 5 (int<-string "5.4")) (test 5 (int<-string "5.9")) (test notanumber (int<-string "notanumber")) (test infinity (int<-string "infinity")) (test neginfinity (int<-string "neginfinity")) :doc "Function Type converting string to int") (func is-empty : boolean [text : string] (native :cpp "if (text->vx_p_iref == -2) { output = vx_core::c_true; }" :js "if (text.length == 0) { output = vx_core.c_true }" :java "if (text.vx_string().length() == 0) { output = Core.c_true; }") :doc "Returns true if text is empty.") (func is-empty : boolean [value : any] (native :cpp "if (value == value->vx_empty()) { output = vx_core::c_true; }" :js "const type = vx_core.f_type_from_any(value) if (value == vx_core.f_empty(type)) { output = vx_core.c_true } else { output = vx_core.c_false }" :java "if (value == value.vx_empty()) { output = Core.c_true; } else { output = Core.c_false; }") :test (test-true (is-empty "")) (test-true (is-empty (list))) (test-true (is-empty (map))) :doc "Returns true if an value is empty") (func is-endswith : boolean [text : string find : string] (native :cpp "std::string stext = text->vx_string(); std::string sfind = find->vx_string(); if (vx_core::vx_boolean_from_string_ends(stext, sfind)) { output = vx_core::c_true; }" :js "if (text.endsWith(find)) { output = vx_core.c_true }" :java "String stext = text.vx_string(); String sfind = find.vx_string(); if (stext.endsWith(sfind)) { output = Core.c_true; }") :doc "Returns true if text ends with find.") (func is-func : boolean [val : any] (native :cpp "vx_core::Type_string extend = " (extends<-any val) "; std::string sextend = extend->vx_string(); vx_core::vx_release(extend); if (sextend == “:func”) { output = vx_core::c_true; }" :js "const extend = " (extends<-any val) " if (extend == ':func') { output = vx_core.c_true }" :java "if (val instanceof Core.Type_func) { output = Core.c_true; }") :doc "Returns true if val is a function.") (func is-int : boolean [value : any] (native :cpp "bool result = vx_core::vx_is_int(value); output = vx_core::vx_new_boolean(result);" :js "vx_core.vx_is_int(value)" :java "boolean result = Core.vx_is_int(value); output = Core.vx_new_boolean(result);") :test (test-true (is-int 2)) (test-true (is-int "2")) (test-true (is-int infinity)) (test-true (is-int "infinity")) :doc "Returns true if the value is an integer.") (func is-float : boolean [value : any] (native :cpp "bool result = vx_core::vx_is_float(value); output = vx_core::vx_new_boolean(result);" :js "vx_core.vx_is_float(value)" :java "boolean result = Core.vx_is_float(value); output = Core.vx_new_boolean(result);") :doc "Returns true if the value is a float.") (func is-number : boolean [value : any] (switch : boolean (typename<-any value) (case (list "vx/core/decimal" "vx/core/float" "vx/core/int" "vx/core/number") true) (else false)) :test (test-true (is-number 5)) (test-true (is-number 5.5)) (test-false (is-number "a")) :doc "Return true if val is a number") (func is-pass<-permission : boolean [permission : permission] (let : boolean [id : string := (:id permission) lookup : permission := (permission<-id-context id)] (= lookup permission)) :context :doc "Returns true if permission passes.") (func last<-list : any-1 [values : list-1] (let [len : int := (length<-list values)] (any<-list values len)) :doc "Returns last value" :test (test "c" (last<-list (list "b" "c")))) (func length<-list : int [values : list-1] (native :cpp "long len = vx_core::vx_int_from_sizet(values->vx_list().size()); if (len > 0) { output = vx_core::vx_new_int(len); }" :js "values.length" :java "int intresult = values.vx_list().size(); output = Core.vx_new_int(intresult);") :doc "Returns the currently used size/length of a list" :test (test 3 (length<-list (stringlist "a" "b" "c")))) (func let : any-1 [args : arglist fn-any : any<-func :: any-1] (native :cpp "vx_core::Type_any any = fn_any->vx_any_from_func(); output = vx_core::vx_any_from_any(generic_any_1, any);" :js "const fn = fn_any['vx_value'] if (fn) { output = fn() }" :java "fn_any.vx_any_from_func(generic_any_1);") :test (test 7 (let [v1 : int := 2 v2 : int := (+ v1 3)] (+ v1 v2)))) (func let-async : any-1 :async [args : arglist fn-any-async : any<-func-async] (native :cpp "fn_any_async->vx_any_from_func_async(generic_any_1);" :js "const fn = fn_any_async['vx_value'] if (fn) { output = await fn() }" :java "fn_any_async.vx_any_from_func_async(generic_any_1);") :doc "Same as normal let but returns async values.") (func list<-list : list-1 [values : list-2 fn-any<-any : any<-any] (native :cpp "vx_core::vx_Type_listany list_value = values->vx_list(); vx_core::vx_Type_listany list_result = vx_core::vx_listany_from_listany_fn(list_value, [fn_any_from_any](vx_core::Type_any val) { return fn_any_from_any->vx_any_from_any(val); }); vx_core::Type_any anylist = generic_list_1->vx_new(list_result); output = vx_core::vx_any_from_any(generic_list_1, anylist);" :js "const fn = fn_any_from_any['vx_value'] if (fn) { output = values.map(fn) output['vx_type'] = generic_list_1 }" :java "List<Core.Type_any> list_value = values.vx_list(); List<Core.Type_any> list_result = Core.arraylist_from_arraylist_fn(list_value, (val) -> { return fn_any_from_any.vx_any_from_any(generic_list_1, val); }); output = Core.f_any_from_any(generic_list_1, generic_list_1.vx_new(list_result));") :doc "Returns a list of processed items from another list") (func list<-list-async : list-1 :async [values : list-2 fn-any<-any-async : any<-any-async] (native :cpp "vx_core::vx_Type_listany list_value = values->vx_list(); vx_core::vx_Type_listasync list_async_result = vx_core::vx_listasync_from_listany_fn(list_value, [fn_any_from_any_async](vx_core::Type_any val) { return fn_any_from_any_async->vx_any_from_any_async(vx_core::vx_type(val), val); }); output = vx_core::vx_async_new_from_listasync(generic_list_1, list_async_result);" :js "const fn = fn_any_from_any_async['vx_value'] if (fn) { const listfuture = values.map(fn) const future = Promise.all(listfuture) output = await future output['vx_type'] = generic_list_1 }" :java "List<Core.Type_any> list_value = values.vx_list(); List<CompletableFuture<Core.Type_any>> list_async_result = Core.arraylist_from_arraylist_fn(list_value, (val) -> { return fn_any_from_any_async.vx_any_from_any_async(generic_list_1, val); }); CompletableFuture<List<Core.Type_any>> async_list_result = Core.async_arraylist_from_arraylist_async(list_async_result); output = Core.async_from_async_fn(async_list_result, (list_result) -> { X work = Core.f_any_from_any(generic_list_1, generic_list_1.vx_new(list_result)); return work; });") :doc "Returns an asynchronous list of the processed asynchronous items from another list") (func list-join<-list : list-1 [values : list-2 fn-any<-any : any<-any] (native :cpp "vx_core::Type_any list = vx_core::vx_list_join_from_list_fn(generic_list_1, values, fn_any_from_any); output = vx_core::vx_any_from_any(generic_list_1, list);" :js "const fn = fn_any_from_any['vx_value'] if (fn) { const listoflist = values.map(fn) output = listoflist.flat() output['vx_type'] = generic_list_1 }" :java "List<Core.Type_any> list_value = values.vx_list(); List<Core.Type_any> list_result = new ArrayList<>(); for (Core.Type_any val : list_value) { Core.Type_any listoflist = fn_any_from_any.vx_any_from_any(generic_list_1, val); if (listoflist instanceof Core.Type_list) { Core.Type_list vallist = (Core.Type_list)listoflist; List<Core.Type_any> listval = vallist.vx_list(); list_result.addAll(listval); } } output = Core.f_any_from_any(generic_list_1, generic_list_1.vx_new(list_result));") :doc "Returns a flattened list of processed items from another list") (func list<-map : list-1 [valuemap : map-2 fn-any<-key-value : any<-key-value] (native :cpp "vx_core::Type_any list = vx_core::vx_list_from_map_fn(generic_list_1, valuemap, fn_any_from_key_value); output = vx_core::vx_any_from_any(generic_list_1, list);" :js "vx_core.vx_list_from_map_fn(generic_list_1, valuemap, fn_any_from_key_value)" :java "Map<String, Core.Type_any> map_value = valuemap.vx_map(); List<Core.Type_any> listresult = Core.arraylist_from_linkedhashmap_fn(map_value, (key, val) -> { Core.Type_string valkey = Core.vx_new_string(key); return fn_any_from_key_value.vx_any_from_key_value(Core.t_any, valkey, val); }); output = Core.f_any_from_any(generic_list_1, generic_list_1.vx_new(listresult));") :test (test (stringlist "a1" "b2") (list<-map : stringlist (stringmap "a" "1" "b" "2") (fn : string [key : string val : string] (string key val)))) :doc "Returns a list from a map by applying a function to each key value.") (func list<-map-async : list-1 :async [valuemap : map-2 fn-any<-key-value-async : any<-key-value-async]) (func list<-type : any [type : any] (native :js "output = [] output['vx_type'] = type") :doc "Create an empty list from a type. Used internally for default lists") (func log : any [value : any] (native :cpp "vx_core::vx_log(value); output = value;" :js "const text = vx_core.f_string_from_any(value) console.log(text) output = value" :java "Core.Type_string stringtext = Core.f_string_from_any(value); String text = stringtext.vx_string(); System.out.println(text); output = value;") :doc "Writes a value to the console.") (func log : any-1 [text : string value : any-1] (native :cpp "vx_core::vx_log(text); vx_core::vx_log(value); output = value;" :js "console.log(text) const svalue = vx_core.f_string_from_any(value) console.log(svalue) output = value" :java "Core.vx_log(text); Core.vx_log(value); output = value;") :doc "Writes a string and a value to the console.") (func main : string [args : anylist :...] (string args) :doc "The default function for app main execution. Arguments come from the command line.") (func map<-list : map-1 [vallist : list-2 fn-any<-any : any<-any :: string] (native :cpp "vx_core::vx_Type_listany listany = vallist->vx_list(); vx_core::vx_Type_mapany mapany = vx_core::vx_map_from_list(listany, fn_any_from_any); output = vx_core::vx_new_from_map(generic_map_1, mapany);" :js "const valmap = {} vallist.map(value => { const fn = fn_any_from_any['vx_value'] if (fn) { const key = fn(value) valmap[key] = value } }) output = { vx_type: generic_map_1, vx_value: valmap }" :java "List<Core.Type_any> listval = vallist.vx_list(); Map<String, Core.Type_any> mapresult = Core.vx_map_from_list_fn(listval, (val) -> { return fn_any_from_any.vx_any_from_any(Core.t_string, val); }); output = Core.f_any_from_any(generic_map_1, output.vx_new_from_map(mapresult));") :test (test (stringmap "keya" "a" "keyb" "b") (map<-list : stringmap (stringlist "a" "b") (fn : string [val : string] (string "key" val)))) :doc "Returns a map from a list by applying a function to generate a key for each value.") (func map<-map : map-1 [valuemap : map-2 fn-any<-key-value : any<-key-value] (native :cpp "vx_core::Type_any map = vx_core::vx_map_from_map_fn(generic_map_1, valuemap, fn_any_from_key_value); output = vx_core::vx_any_from_any(generic_map_1, map);" :js "vx_core.vx_map_from_map_fn(generic_map_1, valuemap, fn_any_from_key_value)" :java "Core.vx_map_from_map_fn(generic_map_1, valuemap, fn_any_from_key_value);") :test (test (stringmap :a "a1" :b "b2") (map<-map : stringmap (stringmap :a "1" :b "2") (fn : string [key : string val : string] (string key val)))) :doc "Returns a map from a map by applying a function to each key value.") (func mempool-addref : none [values : anylist :...] (native :js "for (const value of values) { const value = values[i] if (value.refs) { value.refs += 1 } }") :doc "Add Value Reference") (func mempool-reserve : value [] (native :js "mempool = " mempool-active " output = mempool.valuepool if (output == null) { output = { refs: 0 } } else { const next = output.next if (next == null) { mempool.valuepool = null } else { mempool.valuepool = next output.next = null } }") :doc "Returns a recycled Value or creates a new one.") (func mempool-release : none [value : value] (native :js "const mempool = " mempool-active " value.length = 0 for (const key in value) { delete value[key] } next = mempool.valuepool value.next = next mempool.valuepool = value") :doc "Recycles a Value and adds it to the valuepool.") (func mempool-removeref : none [values : anylist :...] (native :js "for (const value of values) { const value = values[i] if (value.refs) { value.refs -= 1 if (value.refs == 0) { vx_core.f_mempool_removerefchildren(value) vx_core.f_mempool_recyclevalue(value) } } }") :doc "Remove Value Reference") (func mempool-removerefchildren : none [values : anylist :...] (native :js "for (const value of values) { const extend = " (extends<-any value) " switch (extend) { case ':list': vx_core.f_mempool_removeref(...value['vx_value']) break case ':map': case ':struct': vx_core.f_mempool_removeref(...Object.entities(value['vx_value'])) break } }") :doc "Remove Value Child References") (func msg<-error : msg [error : string] (msg :severity msg-error :text error) :doc "Returns a msg from error string") (func msg<-error : msg [code : string detail : any] (msg :code code :detail detail :severity msg-error) :doc "Returns a msg from error code and detail") (func msg<-error : msg [path : string code : string detail : any] (msg :code code :path path :severity msg-error) :doc "Returns a msg from error path code and detail") (func msg<-warning : msg [warning : string] (msg :severity msg-warning :text warning) :doc "Returns a msg from a warning string") (func msgblock<-msgblock-msg : msgblock [origblock : msgblock addmsg : msg] (copy origblock addmsg) :doc "Return a new Msgblock with the added msg") (func msgblock<-msgblock-msgblock : msgblock [origblock : msgblock addblock : msgblock] (msgblock origblock addblock) :doc "Return a new Msgblock with the added block") (func name<-typedef : string [vtypedef : typedef] (:name vtypedef) :doc "Returns the name from a typedef.") (func native : any-1 [clauses : anylist :...] :doc "Native Function Call") (func native<-any : any [value : any-1] (native :js "output = value switch (typeof value) { case 'boolean': case 'number': case 'string': break default: const extend = " (extends<-any value) " switch (extend) { case ':list': output = [...value] break case ':func': case ':map': case ':struct': output = value['vx_value'] break } break }") :doc "Returns native value of value object") (func new : any-1 [type : any-1 values : anylist :...] (native :cpp "T* output = vx_core::vx_new(type, values->vx_list());" :js "vx_core.vx_new(type, values)" :java "Core.Type_any[] arrayany = Core.arrayany_from_anylist(values); Object[] arrayobj = (Core.Type_any[])arrayany; T output = (T)(type.vx_new(arrayobj));") :doc "Create a new Value of Type A" :test (test true (new boolean true)) (test 4 (new int 4)) (test 5.4 (new float 5.4)) (test "a" (new string "a")) (test (stringlist "a" "b" "c") (new stringlist "a" "b" "c")) (test (stringmap :a "1" :b "2") (new stringmap :a "1" :b "2"))) (func number<-func : number [] :doc "Function Type returning number with any parameters") (func or : boolean [val1 : boolean val2 : boolean] (native :cpp "if (val1->vx_boolean() || val2->vx_boolean()) { output = vx_core::c_true; } else { output = vx_core::c_false; }" :js "if (val1 || val2) { output = true } else { output = false }" :java "if (val1.vx_boolean() || val2.vx_boolean()) { output = Core.c_true; } else { output = Core.c_false; }") :doc "Returns true if any value is true" :test (test-true (or true true)) (test-true (or true false)) (test-false (or false false))) (func or : boolean [values : booleanlist :...] (any<-list-start-reduce-next : boolean values false (fn : boolean [reduce : boolean current : boolean next : boolean] (or reduce (or current next)))) :doc "Returns true if any value is true" :test (test-true (or false true false)) (test-false (or false false false))) (func package-global<-name : package [name : string] (any<-map (:packagemap global) name) :doc "Returns a package from global with the given name.") (func packagename<-typedef : string [vtypedef : typedef] (:pkgname vtypedef) :doc "Returns the package name from a typedef.") (func path<-context-path : string [path : string] (path<-setting-path (setting<-context) path) :context :doc "Returns a path from a context") (func path<-setting-path : string [session : setting path : string] :doc "Returns a path from a setting") (func permission<-id-context : permission [id : string] (let [user : user := (user<-context) security : security := (:security user) permissionmap : permissionmap := (:permissionmap security)] (:id permissionmap)) :context :doc "Return a permission from context by id") (func properties<-typedef : argmap [vtypedef : typedef] (:properties vtypedef) :doc "Return property map from typedef") (func proplast<-typedef : arg [vtypedef : typedef] (:proplast vtypedef) :doc "Return last property from typedef") (func resolve : any-1 [value : any-1] value :test (test "a" (resolve "a"))) (func resolve : any-1 [fn-any : any<-func] (native :cpp "if (fn_any) { vx_core::Type_any any = fn_any->vx_any_from_func(); output = vx_core::vx_any_from_any(generic_any_1, any); }" :js "const typedef = " (typedef<-any fn-any) " const extend = vx_core.f_extends_from_typedef(typedef) switch (extend) { case ':func': const fn = fn_any['vx_value'] if (fn) { output = fn() } break default: output = fn_any break }" :java "if (fn_any != null) { output = fn_any.vx_any_from_func(generic_any_1); }") :test (test 4 (resolve (fn : int [] (+ 1 3))))) (func resolve-async : any-1 :async [fn-any : any<-func-async] (native :cpp "if (fn_any) { output = fn_any->vx_any_from_func_async(generic_any_1); }" :js "const typedef = " (typedef<-any fn-any) " const extend = vx_core.f_extends_from_typedef(typedef) switch (extend) { case ':func': const fn = fn_any['vx_value'] if (fn) { output = await fn() } break default: output = fn_any break }" :java "if (fn_any != null) { output = fn_any.vx_any_from_func_async(generic_any_1); }") :test (test 4 (resolve : int (fn : int [] (+ 1 3))))) (func resolve-first : any-1 [clauses : list-1 :...] (first<-list-any<-any clauses resolve) :doc "Returns the first value that is not nothing") (func resolve-list : list-1 [clauses : list-1] (list<-list clauses resolve)) (func security<-context : security (security<-user (user<-context)) :context :doc "Return security from the given context.") (func security<-user : security [user : user] (:security user) :doc "Return security from the given user.") (func session<-context : session (:session context) :context :doc "Returns session from a context") (func setting<-context : setting (:setting context) :context :doc "Returns setting from a context") (func string-repeat : string [text : string repeat : int] (native :cpp "std::string stringtext = vx_core::vx_string_from_string_repeat(text->vx_string(), repeat->vx_int()); output = vx_core::vx_new_string(stringtext);" :js "text.repeat(repeat)" :java "String stringtext = text.vx_string(); int intrepeat = repeat.vx_int(); String stringresult = stringtext.repeat(intrepeat); output = Core.vx_new_string(stringresult);") :test (test "abab" (string-repeat "ab" 2))) (func string<-any : string [value : any] (string<-any-indent value 0 true) :test (test "true" (string<-any true)) (test "4" (string<-any 4)) (test "5.4" (string<-any 5.4)) (test "\"a\"" (string<-any "a")) (test "(stringlist \"a\" \"b\" \"c\")" (string<-any (stringlist "a" "b" "c"))) (test "(stringmap :a \"1\" :b \"2\")" (string<-any (stringmap :a "1" :b "2"))) :doc "Return a string representation of a value") (func string<-any-indent : string [value : any indent : int linefeed : boolean] (native :cpp "std::string soutput = vx_core::vx_string_from_any_indent(value, indent->vx_int(), linefeed->vx_boolean(), false); output = vx_core::vx_new_string(soutput);" :js "output = vx_core.vx_string_from_any_indent(value, indent, linefeed)" :java :auto) :doc "Return a string representation of a value") (func string<-func : string [] :doc "Function Type returning string with any parameters") (func string<-string-find-replace : string [text : string find : string replace : string] (native :cpp :auto :java :auto :js :auto) :test (test "a!b!c" (string<-string-find-replace "axybxyc" "xy" "!")) :doc "Returns a string with all instances of find replaced by replace.") (func switch : any-1 [val : any-2 thenelselist : thenelselist :...] (native :cpp "vx_core::Type_any any = vx_core::vx_switch(generic_any_1, val, thenelselist); output = vx_core::vx_any_from_any(generic_any_1, any);" :js "let fn_any = null if (thenelselist.length > 0) { for (let valthenelse of thenelselist) { const thenelse = valthenelse['vx_value'] const code = thenelse['code'] switch (code) { case ':case': const value = thenelse['value'] if (value == val) { fn_any = thenelse['fn-any'] } else if (typeof value == 'number') { // special handling of notanumber if (isNaN(val) && isNaN(value)) { fn_any = thenelse['fn-any'] } } break case ':casemany': const values = thenelse['values'] if (values.includes(val)) { fn_any = thenelse['fn-any'] } break case ':else': fn_any = thenelse['fn-any'] break } if (fn_any != null) { break } } if (fn_any != null) { const fn = fn_any['vx_value'] if (fn) { output = fn() } } }" :java "Core.Func_any_from_func fn_any = null; List<Core.Type_thenelse> listthenelse = thenelselist.vx_listthenelse(); for (Core.Type_thenelse thenelse : listthenelse) { Core.Type_string code = thenelse.code(); switch (code.vx_string()) { case “:case”: Core.Type_any value = thenelse.value(); Core.Type_boolean iseq = Core.f_eq(val, value); if (iseq.vx_boolean()) { fn_any = thenelse.fn_any(); } break; case “:casemany”: Core.Type_list values = thenelse.values(); Core.Type_boolean iscontain = Core.f_contains_1(values, val); if (iscontain.vx_boolean()) { fn_any = thenelse.fn_any(); } break; case “:else”: fn_any = thenelse.fn_any(); break; } if (fn_any != null) { break; } } if (fn_any != null) { output = fn_any.vx_any_from_func(generic_any_1); }") :test (test 1 (switch : int "d" (case (list "b" "c" "d") 1) (else 2))) :doc "Returns a value based on a logical switch") (func then : thenelse [fn-cond : boolean<-func fn-any : any<-func] (thenelse :code :then :fn-cond fn-cond :fn-any fn-any) :doc "Returns a thenelse struct from a given condition function and value function") (func traits<-typedef : typelist [vtypedef : typedef] (native :cpp "vtypedef->traits();" :js "vtypedef['vx_value']['traits']" :java "vtypedef.traits();") :doc "Return trait list from type") (func type<-any : any [value : any-1] (native :cpp "value->vx_type();" :js "switch (typeof value) { case 'boolean': output = " boolean " break case 'number': switch (value) { case " infinity ": case " neginfinity ": case " notanumber ": output = " int " break default: const strval = '' + value if (strval.indexOf('.') < 0) { output = " int " } else { output = " float " } break } break case 'string': output = " string " break case 'function': output = " func " break default: output = value['vx_type'] if (output == vx_core.t_type) { output = value } break }" :java "output = value.vx_type();") :test (test boolean (type<-any false)) (test int (type<-any 5)) (test string (type<-any "a")) :doc "Gets the Type of a given Value") (func typedef<-any : typedef [val : any] (typedef<-type (type<-any val)) :doc "Gets the typedef of a given value") (func typedef<-type : typedef [val : any] (native :cpp "val->vx_typedef();" :js "output = val" :java "val.vx_typedef();") :doc "Gets the typedef of a given type") (func typename<-any : string [value : any-2] (typename<-type (type<-any value)) :test (test "vx/core/boolean" (typename<-any false)) (test "vx/core/int" (typename<-any 5)) (test "vx/core/string" (typename<-any "a")) :doc "Gets the typename of a given value") (func typename<-type : string [type : any] (typename<-typedef (typedef<-type type)) :doc "Get the name of a given type") (func typename<-typedef : string [vtypedef : typedef] (string (:pkgname vtypedef) "/" (:name vtypedef)) :doc "Get the name of a given type") (func typenames<-typelist : stringlist [typelist : typelist] (list<-list : stringlist typelist (fn : string [type : any] (typename<-type type))) :doc "Get the names from a type list") (func user<-context : user (:user (session<-context)) :context :doc "Returns the current user from context.")
vx/core / any
Description:
  • Any Value for Variant Type
Type Name:
  • any
Extends:
Default:
Usage/Test Cases:
Source Code:
  • (type any :create (native :cpp "// :header vx_core::Type_any vx_type_from_any(vx_core::Type_any value) const;") :doc "Any Value for Variant Type")
vx/core / any-async<-func
Description:
  • A sync or async function that returns one value.
Type Name:
  • any-async<-func
Extends:
  • :func
Default:
Allowed Functions:
  • any<-func
  • any<-func-async
Usage/Test Cases:
Source Code:
  • (type any-async<-func : func :allowfuncs [any<-func any<-func-async] :doc "A sync or async function that returns one value.")
vx/core / any<-anylist
Description:
  • List of any<-any
Type Name:
  • any<-anylist
Extends:
  • :list
Default:
Allowed Functions:
  • any<-any
Usage/Test Cases:
Source Code:
  • (type any<-anylist : list :allowfuncs [any<-any] :doc "List of any<-any")
vx/core / anylist
Description:
  • A list of any
Type Name:
  • anylist
Extends:
  • :list
Default:
Allowed Types:
  • any
Usage/Test Cases:
Source Code:
  • (type anylist : list :allowtypes [any] :doc "A list of any")
vx/core / anymap
Description:
  • A map of any
Type Name:
  • anymap
Extends:
  • :map
Default:
Allowed Types:
  • any
Usage/Test Cases:
Source Code:
  • (type anymap : map :allowtypes [any] :doc "A map of any")
vx/core / anytype
Description:
  • Any Type that allows any Type as a Value
Type Name:
  • anytype
Extends:
  • :type
Default:
Usage/Test Cases:
Source Code:
  • (type anytype : type :doc "Any Type that allows any Type as a Value")
vx/core / arg
Description:
  • A function argument
Type Name:
  • arg
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    name
    vx/core/string
    false
    false
    argtype
    vx/core/any
    false
    false
    fn-any
    vx/core/any<-func
    false
    false
    doc
    vx/core/string
    false
    false
Usage/Test Cases:
Source Code:
  • (type arg : struct :properties [name : string argtype : any fn-any : any<-func doc : string] :doc "A function argument")
vx/core / arglist
Description:
  • A list of arg
Type Name:
  • arglist
Extends:
  • :list
Default:
Allowed Types:
  • arg
Usage/Test Cases:
Source Code:
  • (type arglist : list :allowtypes [arg] :doc "A list of arg")
vx/core / argmap
Description:
  • A map of arg
Type Name:
  • argmap
Extends:
  • :map
Default:
Allowed Types:
  • arg
Usage/Test Cases:
Source Code:
  • (type argmap : map :allowtypes [arg] :doc "A map of arg")
vx/core / boolean
Description:
  • Standard Boolean Type
Type Name:
  • boolean
Extends:
Default:
  • false
Usage/Test Cases:
  • (test-true true)
  • (test-false false)
  • (test-true (boolean true))
  • (test-false (boolean false))
Source Code:
  • (type boolean :default false :allowvalues [true false] :create (native :cpp "// :header bool vx_p_boolean = false; bool vx_boolean() const;" :java "protected boolean vxboolean = false; @Override public boolean vx_boolean() {return vxboolean;}") :test (test-true true) (test-false false) (test-true (boolean true)) (test-false (boolean false)) :doc "Standard Boolean Type")
vx/core / booleanlist
Description:
Type Name:
  • booleanlist
Extends:
  • :list
Default:
Allowed Types:
  • boolean
Usage/Test Cases:
Source Code:
  • (type booleanlist : list :allowtypes [boolean])
vx/core / collection
Description:
Type Name:
  • collection
Extends:
Default:
Allowed Types:
  • list
  • map
Usage/Test Cases:
Source Code:
  • (type collection :allowtypes [list map])
vx/core / compilelanguages
Description:
Type Name:
  • compilelanguages
Extends:
Default:
  • :unknown
Usage/Test Cases:
Source Code:
  • (type compilelanguages :default :unknown :allowvalues [:unknown :cpp :csharp :java :js :kotlin :swift])
vx/core / connect
Description:
  • General connect trait
Type Name:
  • connect
Extends:
Default:
Usage/Test Cases:
Source Code:
  • (type connect :doc "General connect trait")
vx/core / connectlist
Description:
  • List of connect
Type Name:
  • connectlist
Extends:
  • :list
Default:
Allowed Types:
  • connect
Usage/Test Cases:
Source Code:
  • (type connectlist : list :allowtypes [connect] :doc "List of connect")
vx/core / connectmap
Description:
  • Map of connect
Type Name:
  • connectmap
Extends:
  • :map
Default:
Allowed Types:
  • connect
Usage/Test Cases:
Source Code:
  • (type connectmap : map :allowtypes [connect] :doc "Map of connect")
vx/core / const
Description:
  • Original Constant Class.
Type Name:
  • const
Extends:
  • :const
Default:
Usage/Test Cases:
Source Code:
  • (type const : const :doc "Original Constant Class.")
vx/core / constdef
Description:
  • Const Definition Class for inspecting properties.
Type Name:
  • constdef
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    pkgname
    vx/core/string
    false
    false
    name
    vx/core/string
    false
    false
    type
    vx/core/any
    false
    false
Usage/Test Cases:
Source Code:
  • (type constdef : struct :properties [pkgname : string name : string type : any] :doc "Const Definition Class for inspecting properties.")
vx/core / constlist
Description:
  • List of Const.
Type Name:
  • constlist
Extends:
  • :list
Default:
Allowed Types:
  • any
Usage/Test Cases:
Source Code:
  • (type constlist : list :allowtypes [any] :doc "List of Const.")
vx/core / constmap
Description:
  • Map of Const.
Type Name:
  • constmap
Extends:
  • :map
Default:
Allowed Types:
  • any
Usage/Test Cases:
Source Code:
  • (type constmap : map :allowtypes [any] :doc "Map of Const.")
vx/core / context
Description:
  • Context
Type Name:
  • context
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    code
    vx/core/string
    false
    false
    session
    vx/core/session
    false
    false
    setting
    vx/core/setting
    false
    false
    state
    vx/core/state
    false
    false
Usage/Test Cases:
Source Code:
  • (type context : struct :properties [code : string session : session setting : setting state : state] :doc "Context")
vx/core / date
Description:
  • A simple UTC date.
Type Name:
  • date
Extends:
  • :string
Default:
Usage/Test Cases:
Source Code:
  • (type date : string :doc "A simple UTC date.")
vx/core / decimal
Description:
  • A clean version of float like Java BigDecimal.
Type Name:
  • decimal
Extends:
Default:
  • 0
Usage/Test Cases:
Source Code:
  • (type decimal :traits [number] :default 0 :create (native :cpp "// :header std::string vx_p_decimal = “0.0”; float vx_float() const; std::string vx_string() const;" :java "protected String vxdecimal = “0.0”; @Override public float vx_float() { return Float.parseFloat(vxdecimal); } @Override public String vx_string() {return vxdecimal;} @Override public Type_decimal vx_new_from_string(final String sval) { Class_decimal output = new Class_decimal(); output.vxdecimal = sval; return output; }") :doc "A clean version of float like Java BigDecimal.")
vx/core / error
Description:
  • Error Type
Type Name:
  • error
Extends:
Default:
Usage/Test Cases:
Source Code:
  • (type error :doc "Error Type")
vx/core / float
Description:
  • Standard Floating Point Number
Type Name:
  • float
Extends:
Default:
  • 0.0
Usage/Test Cases:
  • (test 4.5 (float 4.5))
Source Code:
  • (type float :default 0.0 :traits [number] :create (native :cpp "// :header float vx_p_float = 0; float vx_float() const;" :java "protected float vxfloat = 0; @Override public float vx_float() {return vxfloat;}") :test (test 4.5 (float 4.5)) :doc "Standard Floating Point Number")
vx/core / func
Description:
  • Original Function Class.
Type Name:
  • func
Extends:
  • :func
Default:
Usage/Test Cases:
Source Code:
  • (type func : func :create (native :cpp "// :header vx_core::Type_funcdef vx_funcdef() const;") :doc "Original Function Class.")
vx/core / funcdef
Description:
  • Func Definition Class for inspecting properties.
Type Name:
  • funcdef
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    pkgname
    vx/core/string
    false
    false
    name
    vx/core/string
    false
    false
    idx
    vx/core/int
    false
    false
    type
    vx/core/any
    false
    false
    async
    vx/core/boolean
    false
    false
Usage/Test Cases:
Source Code:
  • (type funcdef : struct :properties [pkgname : string name : string idx : int type : any async : boolean] :create (native :cpp "// :header static vx_core::Type_funcdef vx_funcdef_new( std::string pkgname, std::string name, long idx, bool async, vx_core::Type_any typ );") :doc "Func Definition Class for inspecting properties.")
vx/core / funclist
Description:
  • List of Func.
Type Name:
  • funclist
Extends:
  • :list
Default:
Allowed Types:
  • func
Usage/Test Cases:
Source Code:
  • (type funclist : list :allowtypes [func] :doc "List of Func.")
vx/core / funcmap
Description:
  • Map of Func.
Type Name:
  • funcmap
Extends:
  • :map
Default:
Allowed Types:
  • func
Usage/Test Cases:
Source Code:
  • (type funcmap : map :allowtypes [func] :doc "Map of Func.")
vx/core / int
Description:
  • A simple integer.
Type Name:
  • int
Extends:
Default:
  • 0
Usage/Test Cases:
  • (test-true (is-int 4))
  • (test-true (is-int "4"))
  • (test-true (is-int infinity))
  • (test-true (is-int neginfinity))
  • (test-true (is-int notanumber))
  • (test-false (is-int "a"))
  • (test-false (is-int 5.5))
Source Code:
  • (type int :default 0 :allowvalues [infinity neginfinity] :traits [number] :create (native :cpp "// :header long vx_p_int = 0; long vx_int() const;" :java "protected int vxint = 0; @Override public int vx_int() {return vxint;}") :test (test-true (is-int 4)) (test-true (is-int "4")) (test-true (is-int infinity)) (test-true (is-int neginfinity)) (test-true (is-int notanumber)) (test-false (is-int "a")) (test-false (is-int 5.5)) :doc "A simple integer.")
vx/core / intlist
Description:
  • A list of int.
Type Name:
  • intlist
Extends:
  • :list
Default:
Allowed Types:
  • int
Usage/Test Cases:
Source Code:
  • (type intlist : list :allowtypes [int] :doc "A list of int.")
vx/core / intmap
Description:
  • A map of int.
Type Name:
  • intmap
Extends:
  • :map
Default:
Allowed Types:
  • int
Usage/Test Cases:
Source Code:
  • (type intmap : map :allowtypes [int] :doc "A map of int.")
vx/core / list
Description:
  • A simple untyped list.
Type Name:
  • list
Extends:
  • :list
Default:
Allowed Types:
  • any
Usage/Test Cases:
Source Code:
  • (type list : list :allowtypes [any] :create (native :cpp "// :header vx_core::vx_Type_listany vx_p_list; vx_core::vx_Type_listany vx_list() const; vx_core::Type_any vx_get_any(vx_core::Type_int index) const; vx_core::Type_any vx_new_from_list(vx_core::vx_Type_listany listval) const;") :doc "A simple untyped list.")
vx/core / listtype
Description:
  • A generic type that extends :list.
Type Name:
  • listtype
Extends:
  • :type
Default:
Usage/Test Cases:
Source Code:
  • (type listtype : type :doc "A generic type that extends :list.")
vx/core / locale
Description:
  • Localization data.
Type Name:
  • locale
Extends:
  • :struct
Default:
Usage/Test Cases:
Source Code:
  • (type locale : struct :doc "Localization data.")
vx/core / map
Description:
  • A simple untyped map.
Type Name:
  • map
Extends:
  • :map
Default:
Allowed Types:
  • any
Usage/Test Cases:
Source Code:
  • (type map : map :allowtypes [any] :create (native :cpp "// :header std::vector<std::string> vx_p_keys; vx_core::vx_Type_mapany vx_p_map; vx_core::vx_Type_mapany vx_map() const; vx_core::Type_any vx_get_any(vx_core::Type_string key) const; vx_core::Type_any vx_new_from_map(vx_core::vx_Type_mapany mapval) const;") :doc "A simple untyped map.")
vx/core / maptype
Description:
  • A generic type that extends :map.
Type Name:
  • maptype
Extends:
  • :type
Default:
Usage/Test Cases:
Source Code:
  • (type maptype : type :doc "A generic type that extends :map.")
vx/core / mempool
Description:
  • Memory Pool
Type Name:
  • mempool
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    valuepool
    vx/core/value
    false
    false
Usage/Test Cases:
Source Code:
  • (type mempool : struct :properties [valuepool : value] :create (native :java "private int vx_max = 20; private Map<String, Deque<Core.Type_any>> vx_maplistany = new ConcurrentHashMap<>(); @Override public <T extends Core.Type_any> T vx_restore(final T generic_any_1) { T output = null; String typename = Core.f_typename_from_any(generic_any_1).vx_string(); Deque<Core.Type_any> listany = this.vx_maplistany.get(typename); if (listany == null) { } else if (!listany.isEmpty()) { Core.Type_any any = listany.remove(); if (any != null) { output = Core.f_any_from_any(generic_any_1, any); } } return output; } @Override public void vx_recycle(final Core.Type_any addany) { String typename = Core.f_typename_from_any(addany).vx_string(); Deque<Core.Type_any> listany = this.vx_maplistany.get(typename); boolean isdestroy = true; int imax = this.vx_max; if (imax == 0) { } else if (listany == null) { isdestroy = false; listany = new ConcurrentLinkedDeque<Core.Type_any>(); listany.add(addany); this.vx_maplistany.put(typename, listany); } else { int ilen = listany.size(); if (ilen < imax) { listany.add(addany); } } if (isdestroy) { // destroy } } @Override public void vx_recyclelist(final List<Core.Type_any> addlistany) { for (Core.Type_any addany : addlistany) { this.vx_recycle(addany); } }") :doc "Memory Pool")
vx/core / msg
Description:
  • Message Type for error handling
Type Name:
  • msg
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    code
    vx/core/string
    Message Code
    false
    false
    detail
    vx/core/any
    Message Detail
    false
    false
    path
    vx/core/string
    Message Path
    false
    false
    severity
    vx/core/int
    Message Severity
    false
    false
    text
    vx/core/string
    Message Text
    false
    false
Usage/Test Cases:
Source Code:
  • (type msg : struct :properties [code : string :doc "Message Code" detail : any :doc "Message Detail" path : string :doc "Message Path" severity : int :doc "Message Severity" text : string :doc "Message Text"] :create (native :cpp "// :header std::exception err;" :java "public Exception err = null;") :doc "Message Type for error handling")
vx/core / msgblock
Description:
  • Block of Messages
Type Name:
  • msgblock
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    msgs
    vx/core/msglist
    false
    false
    msgblocks
    vx/core/msgblocklist
    false
    false
Usage/Test Cases:
Source Code:
  • (type msgblock : struct :properties [msgs : msglist msgblocks : msgblocklist] :create (native :java "public Type_msgblock vx_msgblock_from_copy_arrayval(final Core.Type_any copy, final Object... vals) { Core.Type_msgblock output = Core.e_msgblock; Core.Type_msgblock copymsgblock = copy.vx_msgblock(); if (copymsgblock != null) { output = copymsgblock; } return output; }") :doc "Block of Messages")
vx/core / msgblocklist
Description:
  • List of Message Blocks
Type Name:
  • msgblocklist
Extends:
  • :list
Default:
Allowed Types:
  • msgblock
Usage/Test Cases:
Source Code:
  • (type msgblocklist : list :allowtypes [msgblock] :doc "List of Message Blocks")
vx/core / msglist
Description:
  • List of Messages
Type Name:
  • msglist
Extends:
  • :list
Default:
Allowed Types:
  • msg
Usage/Test Cases:
Source Code:
  • (type msglist : list :allowtypes [msg] :doc "List of Messages")
vx/core / none
Description:
  • No Type. No type is returned at all. e.g. Void
Type Name:
  • none
Extends:
Default:
Usage/Test Cases:
Source Code:
  • (type none :doc "No Type. No type is returned at all. e.g. Void")
vx/core / notype
Description:
  • No Type that allows no Types as a Value
Type Name:
  • notype
Extends:
Default:
Usage/Test Cases:
Source Code:
  • (type notype :doc "No Type that allows no Types as a Value")
vx/core / number
Description:
  • A generic number that could be int, float, or decimal.
Type Name:
  • number
Extends:
Default:
  • 0
Allowed Types:
  • int
  • float
  • decimal
Usage/Test Cases:
Source Code:
  • (type number :default 0 :allowtypes [int float decimal] :doc "A generic number that could be int, float, or decimal.")
vx/core / numberlist
Description:
  • A list of number.
Type Name:
  • numberlist
Extends:
  • :list
Default:
Allowed Types:
  • number
Usage/Test Cases:
Source Code:
  • (type numberlist : list :allowtypes [number] :doc "A list of number.")
vx/core / numbermap
Description:
  • A map of number.
Type Name:
  • numbermap
Extends:
  • :map
Default:
Allowed Types:
  • number
Usage/Test Cases:
Source Code:
  • (type numbermap : map :allowtypes [number] :doc "A map of number.")
vx/core / package
Description:
  • A package that store types, consts and funcs.
Type Name:
  • package
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    pkgname
    vx/core/string
    false
    false
    constmap
    vx/core/constmap
    false
    false
    funcmap
    vx/core/funcmap
    false
    false
    typemap
    vx/core/typemap
    false
    false
    emptymap
    vx/core/map
    false
    false
Usage/Test Cases:
Source Code:
  • (type package : struct :properties [pkgname : string constmap : constmap funcmap : funcmap typemap : typemap emptymap : map] :doc "A package that store types, consts and funcs.")
vx/core / packagemap
Description:
Type Name:
  • packagemap
Extends:
  • :map
Default:
Allowed Types:
  • package
Usage/Test Cases:
Source Code:
  • (type packagemap : map :allowtypes [package])
vx/core / permission
Description:
  • Permission
Type Name:
  • permission
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    id
    vx/core/string
    false
    false
Usage/Test Cases:
Source Code:
  • (type permission : struct :properties [id : string] :doc "Permission")
vx/core / permissionlist
Description:
  • List of Permission
Type Name:
  • permissionlist
Extends:
  • :list
Default:
Allowed Types:
  • permission
Usage/Test Cases:
Source Code:
  • (type permissionlist : list :allowtypes [permission] :doc "List of Permission")
vx/core / permissionmap
Description:
  • Map of Permission
Type Name:
  • permissionmap
Extends:
  • :map
Default:
Allowed Types:
  • permission
Usage/Test Cases:
Source Code:
  • (type permissionmap : map :allowtypes [permission] :doc "Map of Permission")
vx/core / project
Description:
  • A project.
Type Name:
  • project
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    packagemap
    vx/core/packagemap
    false
    false
Usage/Test Cases:
Source Code:
  • (type project : struct :properties [packagemap : packagemap] :doc "A project.")
vx/core / security
Description:
  • Security rules
Type Name:
  • security
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    allowfuncs
    vx/core/funclist
    false
    false
    permissions
    vx/core/permissionlist
    false
    false
    permissionmap
    vx/core/permissionmap
    false
    false
Usage/Test Cases:
Source Code:
  • (type security : struct :properties [allowfuncs : funclist permissions : permissionlist permissionmap : permissionmap] :doc "Security rules")
vx/core / session
Description:
  • Session
Type Name:
  • session
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    user
    vx/core/user
    false
    false
    connectlist
    vx/core/connectlist
    false
    false
    connectmap
    vx/core/connectmap
    false
    false
    locale
    vx/core/locale
    false
    false
    translation
    vx/core/translation
    false
    false
    translationmap
    vx/core/translationmap
    false
    false
Usage/Test Cases:
Source Code:
  • (type session : struct :properties [user : user connectlist : connectlist connectmap : connectmap locale : locale translation : translation translationmap : translationmap] :doc "Session")
vx/core / setting
Description:
  • Settings
Type Name:
  • setting
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    pathmap
    vx/core/stringmap
    false
    false
Usage/Test Cases:
Source Code:
  • (type setting : struct :properties [pathmap : stringmap] :doc "Settings")
vx/core / state
Description:
Type Name:
  • state
Extends:
  • :map
Default:
Allowed Types:
  • statelistener
Usage/Test Cases:
Source Code:
  • (type state : map :allowtypes [statelistener])
vx/core / statelistener
Description:
Type Name:
  • statelistener
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    path
    vx/core/string
    false
    false
    value
    vx/core/any
    false
    false
    fn-boolean
    vx/core/boolean<-none
    false
    false
Usage/Test Cases:
Source Code:
  • (type statelistener : struct :properties [path : string value : any fn-boolean : boolean<-none])
vx/core / string
Description:
  • A simple string.
Type Name:
  • string
Extends:
  • :string
Default:
Usage/Test Cases:
  • (test "a" (string "a"))
  • (test "ab" (string "a" "b"))
Source Code:
  • (type string : string :default "" :create (native :cpp "// :header std::string vx_p_string = “”; std::string vx_string() const;" :java "protected String vxstring = “”; @Override public String vx_string() { return vxstring; }") :test (test "a" (string "a")) (test "ab" (string "a" "b")) :doc "A simple string.")
vx/core / stringlist
Description:
  • A list of string.
Type Name:
  • stringlist
Extends:
  • :list
Default:
Allowed Types:
  • string
Usage/Test Cases:
Source Code:
  • (type stringlist : list :allowtypes [string] :doc "A list of string.")
vx/core / stringmap
Description:
  • A map of string.
Type Name:
  • stringmap
Extends:
  • :map
Default:
Allowed Types:
  • string
Usage/Test Cases:
Source Code:
  • (type stringmap : map :allowtypes [string] :doc "A map of string.")
vx/core / struct
Description:
  • Struct is the type of all structures/objects with properties.
Type Name:
  • struct
Extends:
  • :struct
Default:
Usage/Test Cases:
Source Code:
  • (type struct : struct :create (native :cpp "// :header vx_core::vx_Type_mapany vx_map() const; vx_core::Type_any vx_get_any(vx_core::Type_string key) const;") :doc "Struct is the type of all structures/objects with properties.")
vx/core / thenelse
Description:
Type Name:
  • thenelse
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    code
    vx/core/string
    false
    false
    value
    vx/core/any
    false
    false
    values
    vx/core/list
    false
    false
    fn-cond
    vx/core/boolean<-func
    false
    false
    fn-any
    vx/core/any<-func
    false
    false
Usage/Test Cases:
Source Code:
  • (type thenelse : struct :properties [code : string value : any values : list fn-cond : boolean<-func fn-any : any<-func])
vx/core / thenelselist
Description:
Type Name:
  • thenelselist
Extends:
  • :list
Default:
Allowed Types:
  • thenelse
Usage/Test Cases:
Source Code:
  • (type thenelselist : list :allowtypes [thenelse])
vx/core / translation
Description:
  • i18 language translation.
Type Name:
  • translation
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    name
    vx/core/string
    false
    false
    wordmap
    vx/core/stringmap
    false
    false
Usage/Test Cases:
Source Code:
  • (type translation : struct :properties [name : string wordmap : stringmap] :doc "i18 language translation.")
vx/core / translationlist
Description:
  • i18 language translation list.
Type Name:
  • translationlist
Extends:
  • :list
Default:
Allowed Types:
  • translation
Usage/Test Cases:
Source Code:
  • (type translationlist : list :allowtypes [translation] :doc "i18 language translation list.")
vx/core / translationmap
Description:
  • i18 language translation map.
Type Name:
  • translationmap
Extends:
  • :map
Default:
Allowed Types:
  • translation
Usage/Test Cases:
Source Code:
  • (type translationmap : map :allowtypes [translation] :doc "i18 language translation map.")
vx/core / type
Description:
  • Original Type Class
Type Name:
  • type
Extends:
  • :type
Default:
Usage/Test Cases:
Source Code:
  • (type type : type :doc "Original Type Class")
vx/core / typedef
Description:
  • Type Definition Class for inspecting Type properties.
Type Name:
  • typedef
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    pkgname
    vx/core/string
    false
    false
    name
    vx/core/string
    false
    false
    extends
    vx/core/string
    false
    false
    allowfuncs
    vx/core/funclist
    false
    false
    allowtypes
    vx/core/typelist
    false
    false
    allowvalues
    vx/core/anylist
    false
    false
    disallowfuncs
    vx/core/funclist
    false
    false
    disallowtypes
    vx/core/typelist
    false
    false
    disallowvalues
    vx/core/anylist
    false
    false
    properties
    vx/core/argmap
    false
    false
    proplast
    vx/core/arg
    false
    false
    traits
    vx/core/typelist
    false
    false
Usage/Test Cases:
Source Code:
  • (type typedef : struct :properties [pkgname : string name : string extends : string allowfuncs : funclist allowtypes : typelist allowvalues : anylist disallowfuncs : funclist disallowtypes : typelist disallowvalues : anylist properties : argmap proplast : arg traits : typelist] :create (native :cpp "// :header static vx_core::Type_typedef vx_typedef_new( std::string pkgname, std::string name, std::string extend, vx_core::Type_typelist traits, vx_core::Type_typelist allowtypes, vx_core::Type_typelist disallowtypes, vx_core::Type_funclist allowfuncs, vx_core::Type_funclist disallowfuncs, vx_core::Type_anylist allowvalues, vx_core::Type_anylist disallowvalues, vx_core::Type_argmap properties );") :doc "Type Definition Class for inspecting Type properties.")
vx/core / typelist
Description:
  • List of Types
Type Name:
  • typelist
Extends:
  • :list
Default:
Allowed Types:
  • any
Usage/Test Cases:
Source Code:
  • (type typelist : list :allowtypes [any] :doc "List of Types")
vx/core / typemap
Description:
  • Map of Any Type Class
Type Name:
  • typemap
Extends:
  • :map
Default:
Allowed Types:
  • any
Usage/Test Cases:
Source Code:
  • (type typemap : map :allowtypes [any] :doc "Map of Any Type Class")
vx/core / user
Description:
  • User Type
Type Name:
  • user
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    security
    vx/core/security
    false
    false
    username
    vx/core/string
    false
    false
    token
    vx/core/string
    false
    false
Usage/Test Cases:
Source Code:
  • (type user : struct :properties [security : security username : string token : string] :doc "User Type")
vx/core / value
Description:
Type Name:
  • value
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    next
    vx/core/any
    false
    false
    refs
    vx/core/int
    false
    false
Usage/Test Cases:
Source Code:
  • (type value : struct :properties [next : any refs : int])
vx/core / false
Description:
Constant Name:
  • false
Type:
  • vx/core/boolean
Usage/Test Cases:
  • (test-false false)
Source Code:
  • (const false : boolean :test (test-false false))
vx/core / global
Description:
  • Global variable for project data.
Constant Name:
  • global
Type:
  • vx/core/project
Usage/Test Cases:
Source Code:
  • (const global : project :doc "Global variable for project data.")
vx/core / infinity
Description:
  • Infinity. Returned during unusual calculations.
Constant Name:
  • infinity
Type:
  • vx/core/int
Usage/Test Cases:
Source Code:
  • (const infinity : int (native :js "Infinity") :doc "Infinity. Returned during unusual calculations.")
vx/core / mempool-active
Description:
  • Active Value Memory Pool
Constant Name:
  • mempool-active
Type:
  • vx/core/mempool
Usage/Test Cases:
Source Code:
  • (const mempool-active : mempool :doc "Active Value Memory Pool")
vx/core / msg-info
Description:
  • Message is just information
Constant Name:
  • msg-info
Type:
  • vx/core/int
Usage/Test Cases:
Source Code:
  • (const msg-info : int 0 :doc "Message is just information")
vx/core / msg-warning
Description:
  • Message is a Warning
Constant Name:
  • msg-warning
Type:
  • vx/core/int
Usage/Test Cases:
Source Code:
  • (const msg-warning : int 1 :doc "Message is a Warning")
vx/core / msg-error
Description:
  • Message is an Error
Constant Name:
  • msg-error
Type:
  • vx/core/int
Usage/Test Cases:
Source Code:
  • (const msg-error : int 2 :doc "Message is an Error")
vx/core / msg-severe
Description:
  • Message is a Severe Error
Constant Name:
  • msg-severe
Type:
  • vx/core/int
Usage/Test Cases:
Source Code:
  • (const msg-severe : int 3 :doc "Message is a Severe Error")
vx/core / neginfinity
Description:
  • Negative Infinity. Returned during unusual calculations.
Constant Name:
  • neginfinity
Type:
  • vx/core/int
Usage/Test Cases:
Source Code:
  • (const neginfinity : int (native :js "-Infinity") :doc "Negative Infinity. Returned during unusual calculations.")
vx/core / newline
Description:
  • New line constant
Constant Name:
  • newline
Type:
  • vx/core/string
Usage/Test Cases:
Source Code:
  • (const newline : string "\n" :doc "New line constant")
vx/core / notanumber
Description:
  • Not a number. Returned during invalid calculations.
Constant Name:
  • notanumber
Type:
  • vx/core/int
Usage/Test Cases:
Source Code:
  • (const notanumber : int (native :js "NaN") :doc "Not a number. Returned during invalid calculations.")
vx/core / nothing
Description:
  • Nothing Value. Opposite of every other value. e.g. Nil, Null
Constant Name:
  • nothing
Type:
  • vx/core/string
Usage/Test Cases:
Source Code:
  • (const nothing : string "nothing" :doc "Nothing Value. Opposite of every other value. e.g. Nil, Null")
vx/core / quote
Description:
  • Quotation mark constant
Constant Name:
  • quote
Type:
  • vx/core/string
Usage/Test Cases:
Source Code:
  • (const quote : string `"` :doc "Quotation mark constant")
vx/core / true
Description:
Constant Name:
  • true
Type:
  • vx/core/boolean
Usage/Test Cases:
  • (test-true true)
Source Code:
  • (const true : boolean (native :cpp "true" :js "true" :java "true") :test (test-true true))
vx/core / .
Description:
  • Not Recommened: Support for Object Oriented dot notation. e.g. (this.foo 'a') = this.foo('a')
Function Name:
  • . (alias: dotmethod)
Return Type:
  • vx/core/any
Arguments:
  • Name
    Type
    Generic
    Description
    object
    vx/core/any
    method
    vx/core/string
    params
    vx/core/anylist
Usage/Test Cases:
Source Code:
  • (func . : any [object : any method : string params : anylist :...] (native :js "object[method].apply(params)") :alias "dotmethod" :sideeffects "Depends on object" :doc "Not Recommened: Support for Object Oriented dot notation. e.g. (this.foo 'a') = this.foo('a')")
vx/core / +
Description:
  • Math int plus
Function Name:
  • + (alias: plus)
Return Type:
  • vx/core/int
Arguments:
  • Name
    Type
    Generic
    Description
    num1
    vx/core/int
    num2
    vx/core/int
Usage/Test Cases:
  • (test 5 (+ 2 3))
  • (test 3 (+ 5 -2))
Source Code:
  • (func + : int [num1 : int num2 : int] (native :cpp "long result = num1->vx_int() + num2->vx_int(); output = vx_core::vx_new_int(result);" :js "num1 + num2" :java "int result = num1.vx_int() + num2.vx_int(); output = Core.vx_new_int(result);") :alias "plus" :test (test 5 (+ 2 3)) (test 3 (+ 5 -2)) :doc "Math int plus")
vx/core / +
Description:
  • Math number plus
Function Name:
  • + (alias: plus)
Return Type:
  • vx/core/number
Arguments:
  • Name
    Type
    Generic
    Description
    num1
    vx/core/number
    num2
    vx/core/number
Usage/Test Cases:
  • (test 5 (+ 2 3))
  • (test 3 (+ 5 -2))
Source Code:
  • (func + : number [num1 : number num2 : number] (native :cpp "float result = vx_core::vx_float_from_number(num1) + vx_core::vx_float_from_number(num2); output = vx_core::vx_new_float(result);" :js "num1 + num2" :java "Core.Type_float float1 = Core.t_float.vx_new(num1); Core.Type_float float2 = Core.t_float.vx_new(num2); float result = float1.vx_float() + float2.vx_float(); output = Core.vx_new_float(result);") :alias "plus" :test (test 5 (+ 2 3)) (test 3 (+ 5 -2)) :doc "Math number plus")
vx/core / +
Description:
  • Math int plus
Function Name:
  • + (alias: plus)
Return Type:
  • vx/core/int
Arguments:
  • Name
    Type
    Generic
    Description
    nums
    vx/core/intlist
Usage/Test Cases:
Source Code:
  • (func + : int [nums : intlist :...] (any<-list-start-reduce nums 0 (fn : int [total : int num : int] (+ total num))) :alias "plus" :doc "Math int plus")
vx/core / +
Description:
  • Math number plus
Function Name:
  • + (alias: plus)
Return Type:
  • vx/core/number
Arguments:
  • Name
    Type
    Generic
    Description
    nums
    vx/core/numberlist
Usage/Test Cases:
Source Code:
  • (func + : number [nums : numberlist :...] (any<-list-start-reduce nums 0 (fn : number [total : number num : number] (+ total num))) :alias "plus" :doc "Math number plus")
vx/core / +1
Description:
  • Math int plus 1
Function Name:
  • +1 (alias: plus1)
Return Type:
  • vx/core/int
Arguments:
  • Name
    Type
    Generic
    Description
    num
    vx/core/int
Usage/Test Cases:
  • (test 3 (+1 2))
  • (test -1 (+1 -2))
Source Code:
  • (func +1 : int [num : int] (+ num 1) :alias "plus1" :test (test 3 (+1 2)) (test -1 (+1 -2)) :doc "Math int plus 1")
vx/core / -
Description:
  • Math int minus
Function Name:
  • - (alias: minus)
Return Type:
  • vx/core/int
Arguments:
  • Name
    Type
    Generic
    Description
    num1
    vx/core/int
    num2
    vx/core/int
Usage/Test Cases:
  • (test 1 (- 3 2))
  • (test 7 (- 5 -2))
Source Code:
  • (func - : int [num1 : int num2 : int] (native :cpp "long result = num1->vx_int() - num2->vx_int(); output = vx_core::vx_new_int(result);" :js "num1 - num2" :java "int result = num1.vx_int() - num2.vx_int(); output = Core.vx_new_int(result);") :alias "minus" :test (test 1 (- 3 2)) (test 7 (- 5 -2)) :doc "Math int minus")
vx/core / -
Description:
  • Math number minus
Function Name:
  • - (alias: minus)
Return Type:
  • vx/core/number
Arguments:
  • Name
    Type
    Generic
    Description
    num1
    vx/core/number
    num2
    vx/core/number
Usage/Test Cases:
  • (test 5 (+ 2 3))
  • (test 3 (+ 5 -2))
Source Code:
  • (func - : number [num1 : number num2 : number] (native :cpp "float result = vx_core::vx_float_from_number(num1) - vx_core::vx_float_from_number(num2); output = vx_core::vx_new_float(result);" :js "num1 - num2" :java "Core.Type_float float1 = Core.t_float.vx_new(num1); Core.Type_float float2 = Core.t_float.vx_new(num2); float result = float1.vx_float() - float2.vx_float(); output = Core.vx_new_float(result);") :alias "minus" :test (test 5 (+ 2 3)) (test 3 (+ 5 -2)) :doc "Math number minus")
vx/core / -
Description:
  • Math integer minus
Function Name:
  • - (alias: minus)
Return Type:
  • vx/core/int
Arguments:
  • Name
    Type
    Generic
    Description
    nums
    vx/core/intlist
Usage/Test Cases:
Source Code:
  • (func - : int [nums : intlist :...] (any<-list-start-reduce nums 0 (fn : int [total : int num : int] (- total num))) :alias "minus" :doc "Math integer minus")
vx/core / -
Description:
  • Math number minus
Function Name:
  • - (alias: minus)
Return Type:
  • vx/core/number
Arguments:
  • Name
    Type
    Generic
    Description
    nums
    vx/core/numberlist
Usage/Test Cases:
Source Code:
  • (func - : number [nums : numberlist :...] (any<-list-start-reduce nums 0 (fn : number [total : number num : number] (- total num)) ) :alias "minus" :doc "Math number minus")
vx/core / -1
Description:
  • Math int minus 1
Function Name:
  • -1 (alias: minus1)
Return Type:
  • vx/core/int
Arguments:
  • Name
    Type
    Generic
    Description
    num
    vx/core/int
Usage/Test Cases:
  • (test 1 (-1 2))
  • (test -3 (-1 -2))
Source Code:
  • (func -1 : int [num : int] (- num 1) :alias "minus1" :test (test 1 (-1 2)) (test -3 (-1 -2)) :doc "Math int minus 1")
vx/core / *
Description:
  • Math int multiply
Function Name:
  • * (alias: multiply)
Return Type:
  • vx/core/int
Arguments:
  • Name
    Type
    Generic
    Description
    num1
    vx/core/int
    num2
    vx/core/int
Usage/Test Cases:
  • (test 6 (* 3 2))
  • (test -10 (* 5 -2))
Source Code:
  • (func * : int [num1 : int num2 : int] (native :cpp "long result = num1->vx_int() * num2->vx_int(); output = vx_core::vx_new_int(result);" :js "num1 * num2" :java "int result = num1.vx_int() * num2.vx_int(); output = Core.vx_new_int(result);") :alias "multiply" :test (test 6 (* 3 2)) (test -10 (* 5 -2)) :doc "Math int multiply")
vx/core / *
Description:
  • Math multipy
Function Name:
  • * (alias: multiply)
Return Type:
  • vx/core/number
Arguments:
  • Name
    Type
    Generic
    Description
    num1
    vx/core/number
    num2
    vx/core/number
Usage/Test Cases:
  • (test 6.4 (* 3.2 2))
  • (test -10.2 (* 5.1 -2))
Source Code:
  • (func * : number [num1 : number num2 : number] (native :cpp "float result = vx_core::vx_float_from_number(num1) * vx_core::vx_float_from_number(num2); output = vx_core::vx_new_float(result);" :js "num1 * num2" :java "Core.Type_float float1 = Core.t_float.vx_new(num1); Core.Type_float float2 = Core.t_float.vx_new(num2); float result = float1.vx_float() * float2.vx_float(); output = Core.vx_new_float(result);") :alias "multiply" :test (test 6.4 (* 3.2 2)) (test -10.2 (* 5.1 -2)) :doc "Math multipy")
vx/core / *
Description:
  • Math multiply
Function Name:
  • * (alias: multiply)
Return Type:
  • vx/core/int
Arguments:
  • Name
    Type
    Generic
    Description
    nums
    vx/core/intlist
Usage/Test Cases:
  • (test 24 (* 3 2 4))
  • (test -20 (* 5 -2 2))
Source Code:
  • (func * : int [nums : intlist :...] (any<-list-start-reduce nums 1 (fn : int [total : int num : int] (* total num)) ) :alias "multiply" :test (test 24 (* 3 2 4)) (test -20 (* 5 -2 2)) :doc "Math multiply")
vx/core / *
Description:
  • Math multiply
Function Name:
  • * (alias: multiply)
Return Type:
  • vx/core/number
Arguments:
  • Name
    Type
    Generic
    Description
    nums
    vx/core/numberlist
Usage/Test Cases:
  • (test 24 (* 3 2 4))
  • (test -20 (* 5 -2 2))
Source Code:
  • (func * : number [nums : numberlist :...] (any<-list-start-reduce nums 1 (fn : number [total : number num : number] (* total num)) ) :alias "multiply" :test (test 24 (* 3 2 4)) (test -20 (* 5 -2 2)) :doc "Math multiply")
vx/core / /
Description:
  • Math divide
Function Name:
  • / (alias: divide)
Return Type:
  • vx/core/number
Arguments:
  • Name
    Type
    Generic
    Description
    num1
    vx/core/number
    num2
    vx/core/number
Usage/Test Cases:
  • (test 3 (/ 6 2))
  • (test -5 (/ 10 -2))
Source Code:
  • (func / : number [num1 : number num2 : number] (native :cpp "float float1 = vx_core::vx_float_from_number(num1); float float2 = vx_core::vx_float_from_number(num2); if (float1 == 0) { } else if (float2 == 0) { output = vx_core::c_notanumber; } else { float result = float1 / float2; output = vx_core::vx_new_float(result); }" :js "num1 / num2" :java "Core.Type_float float1 = Core.t_float.vx_new(num1); Core.Type_float float2 = Core.t_float.vx_new(num2); if (float1.vx_float() == 0) { } else if (float2.vx_float() == 0) { output = Core.c_notanumber; } else { float result = float1.vx_float() / float2.vx_float(); output = Core.vx_new_float(result); }") :alias "divide" :test (test 3 (/ 6 2)) (test -5 (/ 10 -2)) :doc "Math divide")
vx/core / =
Description:
  • Boolean equal/equivalent
Function Name:
  • = (alias: eq)
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    val1
    vx/core/any
    val2
    vx/core/any
Usage/Test Cases:
  • (test-true (= true true))
  • (test-true (= 2 2))
  • (test-true (= "a" "a"))
  • (test-true (= (stringlist "a" "b" "c") (new stringlist "a" "b" "c")))
  • (test-true (= (stringmap :a "1" :b "2") (new stringmap :a "1" :b "2")))
Source Code:
  • (func = : boolean [val1 : any val2 : any] (native :cpp "bool isequal = false; if (val1 == val2) { isequal = true; } else { std::string str1 = vx_core::vx_string_from_any(val1); std::string str2 = vx_core::vx_string_from_any(val2); if (str1 == str2) { isequal = true; } } output = vx_core::vx_new_boolean(isequal);" :js "vx_core.vx_eq(val1, val2)" :java "boolean isequal = false; if (val1 == val2) { isequal = true; } else { Core.Type_string strval1 = Core.f_string_from_any(val1); Core.Type_string strval2 = Core.f_string_from_any(val2); if (strval1.vx_string().equals(strval2.vx_string())) { isequal = true; } } output = Core.vx_new_boolean(isequal);") :alias "eq" :test (test-true (= true true)) (test-true (= 2 2)) (test-true (= "a" "a")) (test-true (= (stringlist "a" "b" "c") (new stringlist "a" "b" "c"))) (test-true (= (stringmap :a "1" :b "2") (new stringmap :a "1" :b "2"))) :doc "Boolean equal/equivalent")
vx/core / =
Description:
  • Boolean equal/equivalent
Function Name:
  • = (alias: eq)
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    values
    vx/core/anylist
Usage/Test Cases:
  • (test-false (= 2 2 3))
Source Code:
  • (func = : boolean [values : anylist :...] (any<-list-start-reduce-next : boolean values false (fn : boolean [reduce : boolean current : any next : any] (and reduce (= current next))) ) :alias "eq" :test (test-false (= 2 2 3)) :doc "Boolean equal/equivalent")
vx/core / ==
Description:
  • Strict equality check. Note that all non-empty, non-constants will not be equal.
Function Name:
  • == (alias: eqeq)
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    val1
    vx/core/any
    val2
    vx/core/any
Usage/Test Cases:
  • (test-true (== 0 0))
  • (test-true (== "" ""))
Source Code:
  • (func == : boolean [val1 : any val2 : any] (native :cpp "bool isequal = vx_core::vx_eqeq(val1, val2); output = vx_core::vx_new_boolean(isequal);" :js "output = val1 == val2" :java "boolean isequal = Core.vx_eqeq(val1, val2); output = Core.vx_new_boolean(isequal);") :alias "eqeq" :test (test-true (== 0 0)) (test-true (== "" "")) :doc "Strict equality check. Note that all non-empty, non-constants will not be equal.")
vx/core / !
Description:
  • Boolean not
Function Name:
  • ! (alias: not)
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    val
    vx/core/boolean
    Thing to not
Usage/Test Cases:
  • (test-false false)
  • (test-false (! true))
Source Code:
  • (func ! : boolean [val : boolean :doc "Thing to not"] (native :cpp "vx_core::vx_new_boolean(!val->vx_boolean());" :js "!val" :java "Core.vx_new_boolean(!val.vx_boolean());") :alias "not" :test (test-false false) (test-false (! true)) :doc "Boolean not")
vx/core / !=
Description:
  • Returns true if the first arg is not equal to any of the other arg.
Function Name:
  • != (alias: ne)
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    val1
    vx/core/any
    val2
    vx/core/any
Usage/Test Cases:
  • (test-ne true false)
  • (test-ne "a" "b")
Source Code:
  • (func != : boolean [val1 : any val2 : any] (! (= val1 val2)) :alias "ne" :test (test-ne true false) (test-ne "a" "b") :doc "Returns true if the first arg is not equal to any of the other arg.")
vx/core / !==
Description:
  • Returns true if the first arg is not strictly equal to any of the other arg.
Function Name:
  • !== (alias: neqeq)
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    val1
    vx/core/any
    val2
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func !== : boolean [val1 : any val2 : any] (! (== val1 val2)) :alias "neqeq" :doc "Returns true if the first arg is not strictly equal to any of the other arg.")
vx/core / !-empty
Description:
  • Returns true if text is not empty.
Function Name:
  • !-empty (alias: notempty)
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func !-empty : boolean [text : string] (! (is-empty text)) :alias "notempty" :doc "Returns true if text is not empty.")
vx/core / !-empty
Description:
  • Returns true if val is not empty.
Function Name:
  • !-empty (alias: notempty)
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    val
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func !-empty : boolean [val : any] (! (is-empty val)) :alias "notempty" :doc "Returns true if val is not empty.")
vx/core / <
Description:
  • Returns true if the first arg is less than all of the other args
Function Name:
  • < (alias: lt)
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    val1
    vx/core/any
    val2
    vx/core/any
Usage/Test Cases:
  • (test-true (< 2 3))
Source Code:
  • (func < : boolean [val1 : any val2 : any] (switch (compare val1 val2) (case -1 true) (else false)) :alias "lt" :test (test-true (< 2 3)) :doc "Returns true if the first arg is less than all of the other args")
vx/core / <
Description:
  • Returns true if the first arg is less than all of the other args
Function Name:
  • < (alias: lt)
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    values
    vx/core/anylist
Usage/Test Cases:
  • (test-true (< 2 3))
  • (test-true (< "b" "d" "z"))
Source Code:
  • (func < : boolean [values : anylist :...] (any<-list-start-reduce-next : boolean values true (fn : boolean [reduce : boolean current : any next : any] (and reduce (< current next))) ) :alias "lt" :test (test-true (< 2 3)) (test-true (< "b" "d" "z")) :doc "Returns true if the first arg is less than all of the other args")
vx/core / <=
Description:
  • Returns true if the first arg is less or equal than all of the other args
Function Name:
  • <= (alias: le)
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    val1
    vx/core/any
    val2
    vx/core/any
Usage/Test Cases:
  • (test-true (<= 2 3))
Source Code:
  • (func <= : boolean [val1 : any val2 : any] (! (> val1 val2)) :alias "le" :test (test-true (<= 2 3)) :doc "Returns true if the first arg is less or equal than all of the other args")
vx/core / <=
Description:
  • Returns true if the first arg is less or equal than all of the other args
Function Name:
  • <= (alias: le)
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    args
    vx/core/anylist
Usage/Test Cases:
  • (test-true (<= "b" "d" "z"))
Source Code:
  • (func <= : boolean [args : anylist :...] (! (> args)) :alias "le" :test (test-true (<= "b" "d" "z")) :doc "Returns true if the first arg is less or equal than all of the other args")
vx/core / <-
Description:
  • This is a special function that applies a value as the first argument for the first function. The result is then used as the first argument on the next function, etc. Sometimes this improves readability.
Function Name:
  • <- (alias: chainfirst)
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any-1
    fnlist
    vx/core/any<-anylist
Usage/Test Cases:
  • (test (* (+ (- 5 3) 3) 2) (<- 5 (- 3) (+ 3) (* 2)))
Source Code:
  • (func <- : any-1 [value : any-1 fnlist : any<-anylist :...] :alias chainfirst :test (test (* (+ (- 5 3) 3) 2) (<- 5 (- 3) (+ 3) (* 2))) :doc "This is a special function that applies a value as the first argument for the first function. The result is then used as the first argument on the next function, etc. Sometimes this improves readability.")
vx/core / <<-
Description:
  • This is a special function that applies a value as the last argument for the first function. The result is then used as the last argument on the next function, etc. Sometimes this improves readability.
Function Name:
  • <<- (alias: chainlast)
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any-1
    fnlist
    vx/core/any<-anylist
Usage/Test Cases:
  • (test (* (+ (- 3 5) 3) 2) (<<- 5 (- 3) (+ 3) (* 2)))
Source Code:
  • (func <<- : any-1 [value : any-1 fnlist : any<-anylist :...] :alias chainlast :test (test (* (+ (- 3 5) 3) 2) (<<- 5 (- 3) (+ 3) (* 2))) :doc "This is a special function that applies a value as the last argument for the first function. The result is then used as the last argument on the next function, etc. Sometimes this improves readability.")
vx/core / >
Description:
  • Returns true if the first arg is greater than all of the other args
Function Name:
  • > (alias: gt)
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    val1
    vx/core/any
    val2
    vx/core/any
Usage/Test Cases:
  • (test-true (> 3 2))
Source Code:
  • (func > : boolean [val1 : any val2 : any] (switch (compare val1 val2) (case 1 true) (else false)) :alias "gt" :test (test-true (> 3 2)) :doc "Returns true if the first arg is greater than all of the other args")
vx/core / >
Description:
  • Returns true if the first arg is greater than all of the other args
Function Name:
  • > (alias: gt)
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    values
    vx/core/anylist
Usage/Test Cases:
  • (test-true (> "z" "y" "b"))
Source Code:
  • (func > : boolean [values : anylist :...] (any<-list-start-reduce-next : boolean values true (fn : boolean [reduce : boolean current : any next : any] (and reduce (> current next))) ) :alias "gt" :test (test-true (> "z" "y" "b")) :doc "Returns true if the first arg is greater than all of the other args")
vx/core / >=
Description:
  • Returns true if val1 is greater or equal to val2
Function Name:
  • >= (alias: ge)
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    val1
    vx/core/any
    val2
    vx/core/any
Usage/Test Cases:
  • (test-true (>= 3 2))
Source Code:
  • (func >= : boolean [val1 : any val2 : any] (! (< val1 val2)) :alias "ge" :test (test-true (>= 3 2)) :doc "Returns true if val1 is greater or equal to val2")
vx/core / >=
Description:
  • Returns true if the first arg is greater or equal than all of the other args
Function Name:
  • >= (alias: ge)
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    args
    vx/core/anylist
Usage/Test Cases:
  • (test-true (>= "z" "b" "b"))
Source Code:
  • (func >= : boolean [args : anylist :...] (! (< args)) :alias "ge" :test (test-true (>= "z" "b" "b")) :doc "Returns true if the first arg is greater or equal than all of the other args")
vx/core / allowfuncs<-security
Description:
  • Returns allowfuncs from a given security.
Function Name:
  • allowfuncs<-security
Return Type:
  • vx/core/funclist
Arguments:
  • Name
    Type
    Generic
    Description
    security
    vx/core/security
Usage/Test Cases:
Source Code:
  • (func allowfuncs<-security : funclist [security : security] (:allowfuncs security) :doc "Returns allowfuncs from a given security.")
vx/core / allowtypenames<-typedef
Description:
  • Return allow name list from type
Function Name:
  • allowtypenames<-typedef
Return Type:
  • vx/core/stringlist
Arguments:
  • Name
    Type
    Generic
    Description
    vtypedef
    vx/core/typedef
Usage/Test Cases:
Source Code:
  • (func allowtypenames<-typedef : stringlist [vtypedef : typedef] (typenames<-typelist (allowtypes<-typedef vtypedef)) :doc "Return allow name list from type")
vx/core / allowtypes<-typedef
Description:
  • Return allow type list from type
Function Name:
  • allowtypes<-typedef
Return Type:
  • vx/core/typelist
Arguments:
  • Name
    Type
    Generic
    Description
    vtypedef
    vx/core/typedef
Usage/Test Cases:
Source Code:
  • (func allowtypes<-typedef : typelist [vtypedef : typedef] (native :cpp "vtypedef->allowtypes();" :js "vtypedef['vx_value']['allowtypes']" :java "vtypedef.allowtypes();") :doc "Return allow type list from type")
vx/core / and
Description:
  • Returns true if all values are true
Function Name:
  • and
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    val1
    vx/core/boolean
    val2
    vx/core/boolean
Usage/Test Cases:
  • (test-true (and true true))
  • (test-false (and true false))
Source Code:
  • (func and : boolean [val1 : boolean val2 : boolean] (native :cpp "if (val1->vx_boolean() && val2->vx_boolean()) { output = vx_core::c_true; } else { output = vx_core::c_false; }" :js "if (val1 && val2) { output = true } else { output = false }" :java "if (val1.vx_boolean() && val2.vx_boolean()) { output = Core.c_true; } else { output = Core.c_false; }") :test (test-true (and true true)) (test-false (and true false)) :doc "Returns true if all values are true")
vx/core / and
Description:
  • Returns true if all values are true
Function Name:
  • and
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    values
    vx/core/booleanlist
Usage/Test Cases:
  • (test-true (and true true true))
  • (test-false (and true true false))
Source Code:
  • (func and : boolean [values : booleanlist :...] (switch : boolean (length<-list values) (case 0 true) (case 1 (:1 values)) (else (any<-list-start-reduce-next : boolean values true (fn : boolean [reduce : boolean current : boolean next : boolean] (and reduce (and current next))) ))) :test (test-true (and true true true)) (test-false (and true true false)) :doc "Returns true if all values are true")
vx/core / any<-any
Description:
  • Function Type taking any value any-2 and returning generic any-1
Function Name:
  • any<-any
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any-2
Usage/Test Cases:
Source Code:
  • (func any<-any : any-1 [value : any-2] (native :cpp "output = vx_core::vx_any_from_any(generic_any_1, value);" :js "value" :java "@SuppressWarnings(“unchecked”) output = (T)value;") :doc "Function Type taking any value any-2 and returning generic any-1")
vx/core / any<-any-async
Description:
  • Function Type taking any value any-2 and returning generic any-1
Function Name:
  • any<-any-async
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any-2
Usage/Test Cases:
Source Code:
  • (func any<-any-async : any-1 [value : any-2] :async :doc "Function Type taking any value any-2 and returning generic any-1")
vx/core / any<-any-context
Description:
  • Function Type taking any value any-2 and returning generic any-1 using context
Function Name:
  • any<-any-context
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any-2
Usage/Test Cases:
Source Code:
  • (func any<-any-context : any-1 [value : any-2] (native :java "@SuppressWarnings(“unchecked”) output = (T)value;") :context :doc "Function Type taking any value any-2 and returning generic any-1 using context")
vx/core / any<-any-context-async
Description:
  • Generic Function taking any value any-2 and returning generic any-1
Function Name:
  • any<-any-context-async
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any-2
Usage/Test Cases:
Source Code:
  • (func any<-any-context-async : any-1 [value : any-2] :async :context :doc "Generic Function taking any value any-2 and returning generic any-1")
vx/core / any<-any-key-value
Description:
  • Generic Function returning Generic any-1 from a any-1, a key, and a value.
Function Name:
  • any<-any-key-value
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    current
    vx/core/any-1
    key
    vx/core/string
    value
    vx/core/any-2
Usage/Test Cases:
Source Code:
  • (func any<-any-key-value : any-1 [current : any-1 key : string value : any-2] :doc "Generic Function returning Generic any-1 from a any-1, a key, and a value.")
vx/core / any<-int
Description:
  • Generic Function returning Generic any-1 from an int
Function Name:
  • any<-int
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func any<-int : any-1 [value : int] :doc "Generic Function returning Generic any-1 from an int")
vx/core / any<-func
Description:
  • Generic Function returning Generic any-1 with any parameters
Function Name:
  • any<-func
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func any<-func : any-1 [] :doc "Generic Function returning Generic any-1 with any parameters")
vx/core / any<-func-async
Description:
  • Generic Function returning Generic any-1 with any parameters
Function Name:
  • any<-func-async
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func any<-func-async : any-1 [] :async :doc "Generic Function returning Generic any-1 with any parameters")
vx/core / any<-key-value
Description:
  • Generic Function returning Generic any-1 from a key and a value
Function Name:
  • any<-key-value
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    key
    vx/core/string
    val
    vx/core/any-2
Usage/Test Cases:
Source Code:
  • (func any<-key-value : any-1 [key : string val : any-2] :doc "Generic Function returning Generic any-1 from a key and a value")
vx/core / any<-key-value-async
Description:
  • Generic Function returning Asynchronous Generic any-1 from a key and a value
Function Name:
  • any<-key-value-async
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    key
    vx/core/string
    val
    vx/core/any-2
Usage/Test Cases:
Source Code:
  • (func any<-key-value-async : any-1 [key : string val : any-2] :async :doc "Generic Function returning Asynchronous Generic any-1 from a key and a value")
vx/core / any<-list
Description:
  • Returns nth value from a list or none if out of bounds
Function Name:
  • any<-list
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    values
    vx/core/list-1
    index
    vx/core/int
Usage/Test Cases:
  • (test "b" (any<-list (list "a" "b" "c") 2))
  • (test "b" (:2 (stringlist "a" "b" "c")))
Source Code:
  • (func any<-list : any-1 [values : list-1 index : int] (native :cpp "long intindex = index->vx_int(); vx_core::vx_Type_listany listvalue = values->vx_list(); long intsize = vx_core::vx_int_from_sizet(listvalue.size()); if (intindex <= intsize) { vx_core::Type_any value = listvalue[intindex - 1]; output = vx_core::vx_any_from_any(generic_any_1, value); }" :js "if (index <= values.length) { output = values[index - 1] }" :java "int intindex = index.vx_int(); int intsize = values.vx_list().size(); if (intindex <= intsize) { List<Core.Type_any> listvalue = values.vx_list(); Core.Type_any value = listvalue.get(intindex - 1); output = Core.f_any_from_any(generic_any_1, value); }") :test (test "b" (any<-list (list "a" "b" "c") 2)) (test "b" (:2 (stringlist "a" "b" "c"))) :doc "Returns nth value from a list or none if out of bounds")
vx/core / any<-list-start-reduce
Description:
  • Returns a val from a list reduce operation
Function Name:
  • any<-list-start-reduce
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    list
    vx/core/list-2
    valstart
    vx/core/any-1
    fn-reduce
    vx/core/any<-reduce
Usage/Test Cases:
  • (test 24 (any<-list-start-reduce : int (intlist 3 2 4) 1 (fn : int [total : int num : int] (* total num))))
Source Code:
  • (func any<-list-start-reduce : any-1 [list : list-2 valstart : any-1 fn-reduce : any<-reduce] (native :cpp "vx_core::Type_any work = valstart; std::vector<vx_core::Type_any> listval = list->vx_list(); for (vx_core::Type_any item : listval) { work = fn_reduce->vx_any_from_reduce(work, item); }; output = vx_core::vx_any_from_any(generic_any_1, work);" :js "output = valstart const fn = fn_reduce['vx_value'] if (fn) { for (const item of list) { output = fn(output, item) } }" :java "output = valstart; List<Core.Type_any> listval = list.vx_list(); for (Core.Type_any item : listval) { output = fn_reduce.vx_any_from_reduce(generic_any_1, output, item); }") :test (test 24 (any<-list-start-reduce : int (intlist 3 2 4) 1 (fn : int [total : int num : int] (* total num)))) :doc "Returns a val from a list reduce operation")
vx/core / any<-list-start-reduce-next
Description:
  • Returns a val from a list reduce operation
Function Name:
  • any<-list-start-reduce-next
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    list
    vx/core/list-2
    valstart
    vx/core/any-1
    fn-reduce-next
    vx/core/any<-reduce-next
Usage/Test Cases:
Source Code:
  • (func any<-list-start-reduce-next : any-1 [list : list-2 valstart : any-1 fn-reduce-next : any<-reduce-next] (native :cpp "vx_core::Type_any result = vx_core::vx_any_from_list_result_next(generic_any_1, list, valstart, fn_reduce_next); output = vx_core::vx_any_from_any(generic_any_1, result);" :js "output = valstart const fn = fn_reduce_next['vx_value'] if (fn) { let current = vx_core.e_any let first = true for (const next of list) { if (first) { first = false } else { output = fn(output, current, next) } current = next } }" :java "output = valstart; final List<Core.Type_any> listval = list.vx_list(); Core.Type_any current = Core.e_any; boolean first = true; for (final Core.Type_any next : listval) { if (first) { first = false; } else { output = fn_reduce_next.vx_any_from_reduce_next(generic_any_1, output, current, next); } current = next; }") :doc "Returns a val from a list reduce operation")
vx/core / any<-map
Description:
  • Returns value from a map or empty if not found
Function Name:
  • any<-map
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    valuemap
    vx/core/map-1
    key
    vx/core/string
Usage/Test Cases:
  • (test "v2" (any<-map (map :a "v1" :b "v2" :c "v3") :b))
Source Code:
  • (func any<-map : any-1 [valuemap : map-1 key : string] (native :cpp "vx_core::Type_any val = valuemap->vx_get_any(key); output = vx_core::vx_any_from_any(generic_any_1, val);" :js "if (key.startsWith(':')) { key = key.substring(1) } const mapval = valuemap['vx_value'] let val = mapval[key] if (val != undefined) { output = val }" :java "Core.vx_any_from_map(generic_any_1, valuemap, key);") :test (test "v2" (any<-map (map :a "v1" :b "v2" :c "v3") :b)) :doc "Returns value from a map or empty if not found")
vx/core / any<-map-start-reduce
Description:
  • Returns a value by reducing each element of a map.
Function Name:
  • any<-map-start-reduce
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    map
    vx/core/map-1
    start
    vx/core/any-1
    fn-reduce
    vx/core/any<-any-key-value
Usage/Test Cases:
  • (test "xayb" (any<-map-start-reduce (stringmap :a "x" :b "y") "" (fn : string [current : string key : string value : any] (copy current value key))))
Source Code:
  • (func any<-map-start-reduce : any-1 [map : map-1 start : any-1 fn-reduce : any<-any-key-value :: any-1 :: any-1] (native :cpp :auto :java :auto :js :auto) :test (test "xayb" (any<-map-start-reduce (stringmap :a "x" :b "y") "" (fn : string [current : string key : string value : any] (copy current value key)))) :doc "Returns a value by reducing each element of a map.")
vx/core / any<-none
Description:
  • Function Type returning Generic any-1 with no parameters
Function Name:
  • any<-none
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func any<-none : any-1 [] :doc "Function Type returning Generic any-1 with no parameters")
vx/core / any<-none-async
Description:
  • Function Type returning Generic any-1 with no parameters
Function Name:
  • any<-none-async
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func any<-none-async : any-1 :async [] :doc "Function Type returning Generic any-1 with no parameters")
vx/core / any<-reduce
Description:
Function Name:
  • any<-reduce
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    result
    vx/core/any-1
    item
    vx/core/any-2
Usage/Test Cases:
Source Code:
  • (func any<-reduce : any-1 [result : any-1 item : any-2])
vx/core / any<-reduce-async
Description:
Function Name:
  • any<-reduce-async
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    result
    vx/core/any-1
    item
    vx/core/any-2
Usage/Test Cases:
Source Code:
  • (func any<-reduce-async : any-1 :async [result : any-1 item : any-2])
vx/core / any<-reduce-next
Description:
Function Name:
  • any<-reduce-next
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    result
    vx/core/any-1
    current
    vx/core/any-2
    next
    vx/core/any-2
Usage/Test Cases:
Source Code:
  • (func any<-reduce-next : any-1 [result : any-1 current : any-2 next : any-2])
vx/core / any<-reduce-next-async
Description:
Function Name:
  • any<-reduce-next-async
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    result
    vx/core/any-1
    current
    vx/core/any-2
    next
    vx/core/any-2
Usage/Test Cases:
Source Code:
  • (func any<-reduce-next-async : any-1 :async [result : any-1 current : any-2 next : any-2])
vx/core / any<-struct
Description:
  • Returns value from a struct
Function Name:
  • any<-struct
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    vstruct
    vx/core/struct-2
    key
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func any<-struct : any-1 [vstruct : struct-2 key : string] (native :cpp "vx_core::Type_any val = vstruct->vx_get_any(key); output = vx_core::vx_any_from_any(generic_any_1, val);" :js "const subvalmap = vstruct['vx_value'] if (subvalmap != undefined) { if (key.startsWith(':')) { key = key.substring(1) } const val = subvalmap[key] if (val != undefined) { output = val } }" :java "Core.Type_any val = vstruct.vx_any(key); output = Core.f_any_from_any(generic_any_1, val);") :doc "Returns value from a struct")
vx/core / async
Description:
  • Returns an asynchonous version value. This exists mostly for type-casting.
Function Name:
  • async
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any-1
Usage/Test Cases:
Source Code:
  • (func async : any-1 :async [value : any-1] (native :js "value" :java "output = Core.async_new_completed(value);") :doc "Returns an asynchonous version value. This exists mostly for type-casting.")
vx/core / boolean<-any
Description:
  • Function Type taking generic any-1 and returning boolean
Function Name:
  • boolean<-any
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any-1
Usage/Test Cases:
Source Code:
  • (func boolean<-any : boolean [value : any-1] :doc "Function Type taking generic any-1 and returning boolean")
vx/core / boolean<-func
Description:
  • Function Type returning boolean with any parameters
Function Name:
  • boolean<-func
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func boolean<-func : boolean [] :doc "Function Type returning boolean with any parameters")
vx/core / boolean<-none
Description:
  • Function Type returning boolean with no parameters
Function Name:
  • boolean<-none
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func boolean<-none : boolean [] :doc "Function Type returning boolean with no parameters")
vx/core / boolean-permission<-func
Description:
  • Returns true if the given func has permission.
Function Name:
  • boolean-permission<-func
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    func
    vx/core/func
Usage/Test Cases:
Source Code:
  • (func boolean-permission<-func : boolean [func : func] (contains (allowfuncs<-security (security<-context)) func) :context :doc "Returns true if the given func has permission.")
vx/core / case
Description:
Function Name:
  • case
Return Type:
  • vx/core/thenelse
Arguments:
  • Name
    Type
    Generic
    Description
    values
    vx/core/list-1
    fn-any
    vx/core/any<-func
Usage/Test Cases:
Source Code:
  • (func case : thenelse [values : list-1 fn-any : any<-func] (thenelse :code :casemany :values values :fn-any fn-any))
vx/core / case
Description:
Function Name:
  • case
Return Type:
  • vx/core/thenelse
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any-1
    fn-any
    vx/core/any<-func
Usage/Test Cases:
Source Code:
  • (func case : thenelse [value : any-1 fn-any : any<-func] (thenelse :code :case :value value :fn-any fn-any))
vx/core / compare
Description:
  • Returns 0 if vals are equal, 1 if val1 > val2, -1 if val1 < val2
Function Name:
  • compare
Return Type:
  • vx/core/int
Arguments:
  • Name
    Type
    Generic
    Description
    val1
    vx/core/any
    val2
    vx/core/any
Usage/Test Cases:
  • (test 1 (compare 3 2))
  • (test 1 (compare "z" "a"))
Source Code:
  • (func compare : int [val1 : any val2 : any] (native :cpp "long intresult = vx_core::vx_compare(val1, val2); output = vx_core::vx_new_int(intresult);" :js "if (val1 == val2) { output = 0 } else if (val1 < val2) { output = -1 } else { output = 1 }" :java "int intresult = 0; if ((val1 instanceof Core.Type_number) && (val2 instanceof Core.Type_number)) { Core.Type_number num1 = (Core.Type_number)val1; Core.Type_number num2 = (Core.Type_number)val2; float float1 = Core.t_float.vx_new(num1).vx_float(); float float2 = Core.t_float.vx_new(num2).vx_float(); if (float1 < float2) { intresult = -1; } else if (float1 > float2) { intresult = 1; } } else { String stringval1 = Core.f_string_from_any(val1).vx_string(); String stringval2 = Core.f_string_from_any(val2).vx_string(); int compare = stringval1.compareTo(stringval2); if (compare > 0) { intresult = 1; } else if (compare < 0) { intresult = -1; } } output = Core.vx_new_int(intresult);") :test (test 1 (compare 3 2)) (test 1 (compare "z" "a")) :doc "Returns 0 if vals are equal, 1 if val1 > val2, -1 if val1 < val2")
vx/core / contains
Description:
  • Returns true if the given list contains the given value.
Function Name:
  • contains
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    find
    vx/core/string
Usage/Test Cases:
  • (test-true (contains "abcde" "cd"))
  • (test-false (contains "abcde" "dc"))
Source Code:
  • (func contains : boolean [text : string find : string] (native :cpp "bool check = vx_boolean_from_string_find(text->vx_string(), find->vx_string()); output = vx_core::vx_new_boolean(check);" :js "vx_core.vx_boolean_from_string_find(text, find)" :java "boolean check = vx_boolean_from_string_find(text.vx_string(), find.vx_string()); output = Core.vx_new_boolean(check);") :test (test-true (contains "abcde" "cd")) (test-false (contains "abcde" "dc")) :doc "Returns true if the given list contains the given value.")
vx/core / contains
Description:
  • Returns true if the given list contains the given value.
Function Name:
  • contains
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    values
    vx/core/list-2
    Any list
    find
    vx/core/any
    Any value
Usage/Test Cases:
  • (test-true (contains (stringlist "1" "2" "3") "2"))
  • (test-true (contains (intlist 1 2 3) 2))
  • (test-false (contains (list 1 "2" 3) 2))
Source Code:
  • (func contains : boolean [values : list-2 :doc "Any list" find : any :doc "Any value"] (native :cpp "bool booleanresult = false; vx_core::vx_Type_listany listvalues = values->vx_list(); for (vx_core::Type_any item : listvalues) { vx_core::Type_boolean iseq = vx_core::f_eq(item, find); if (iseq->vx_boolean()) { booleanresult = true; break; } } output = vx_core::vx_new_boolean(booleanresult);" :js "values.includes(find)" :java "boolean booleanresult = false; List<Core.Type_any> listvalues = values.vx_list(); for (Core.Type_any item : listvalues) { Core.Type_boolean iseq = Core.f_eq(item, find); if (iseq.vx_boolean()) { booleanresult = true; break; } } output = Core.vx_new_boolean(booleanresult);") :test (test-true (contains (stringlist "1" "2" "3") "2")) (test-true (contains (intlist 1 2 3) 2)) (test-false (contains (list 1 "2" 3) 2)) :doc "Returns true if the given list contains the given value.")
vx/core / context-main
Description:
  • Returns the default context for app main execution. Arguments come from the command line.
Function Name:
  • context-main
Return Type:
  • vx/core/context
Arguments:
  • Name
    Type
    Generic
    Description
    args
    vx/core/anylist
Usage/Test Cases:
Source Code:
  • (func context-main : context [args : anylist :...] (context) :doc "Returns the default context for app main execution. Arguments come from the command line.")
vx/core / copy
Description:
  • Returns a copy of a given value with the given values added or updated.
Function Name:
  • copy
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any
    values
    vx/core/anylist
Usage/Test Cases:
  • (test (stringmap :a "1" :b "2") (copy (stringmap :a "1") :b "2"))
Source Code:
  • (func copy : any-1 [value : any values : anylist :...] (native :cpp "T* output = vx_core::vx_copy(generic_any_1, value, values->vx_list());" :js "vx_core.f_new(value, ...values)" :java "@SuppressWarnings(“unchecked”) Core.Type_any[] arrayany = Core.arrayany_from_anylist(values); Object[] arrayobj = (Core.Type_any[])arrayany; T output = (T)(value.vx_copy(arrayobj));") :bigospace :n :bigotime :n :test (test (stringmap :a "1" :b "2") (copy (stringmap :a "1") :b "2")) :doc "Returns a copy of a given value with the given values added or updated.")
vx/core / else
Description:
Function Name:
  • else
Return Type:
  • vx/core/thenelse
Arguments:
  • Name
    Type
    Generic
    Description
    fn-any
    vx/core/any<-func
Usage/Test Cases:
Source Code:
  • (func else : thenelse [fn-any : any<-func] (thenelse :code :else :fn-any fn-any))
vx/core / empty
Description:
  • Returns the empty value for a given type. Can be called using (empty type) or simply (type)
Function Name:
  • empty
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    type
    vx/core/any-1
Usage/Test Cases:
  • (test "" (empty string))
  • (test (list) (empty list))
  • (test (map) (empty map))
Source Code:
  • (func empty : any-1 [type : any-1] (native :cpp "T* output = vx_core::vx_any_from_any(type, type->vx_empty());" :js "vx_core.vx_empty(type)" :java "@SuppressWarnings(“unchecked”) T output = (T)(type.vx_empty());") :test (test "" (empty string)) (test (list) (empty list)) (test (map) (empty map)) :doc "Returns the empty value for a given type. Can be called using (empty type) or simply (type)")
vx/core / extends<-any
Description:
Function Name:
  • extends<-any
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    val
    vx/core/any-1
Usage/Test Cases:
Source Code:
  • (func extends<-any : string [val : any-1] (extends<-typedef (typedef<-any val)))
vx/core / extends<-typedef
Description:
  • Get the basetype of a given type
Function Name:
  • extends<-typedef
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    vtypedef
    vx/core/typedef
Usage/Test Cases:
Source Code:
  • (func extends<-typedef : string [vtypedef : typedef] (:extends vtypedef) :doc "Get the basetype of a given type")
vx/core / first<-list
Description:
  • Returns first value
Function Name:
  • first<-list
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    values
    vx/core/list-1
Usage/Test Cases:
  • (test "b" (first<-list (stringlist "b" "c")))
Source Code:
  • (func first<-list : any-1 [values : list-1] (any<-list values 1) :doc "Returns first value" :test (test "b" (first<-list (stringlist "b" "c"))))
vx/core / first<-list-any<-any
Description:
  • Returns first value that is not nothing
Function Name:
  • first<-list-any<-any
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    values
    vx/core/list-1
    fn-any<-any
    vx/core/any<-any
Usage/Test Cases:
  • (test "b" (first<-list-any<-any (list nothing "b" "c") resolve))
Source Code:
  • (func first<-list-any<-any : any-1 [values : list-1 fn-any<-any : any<-any] (native :cpp "std::vector<vx_core::Type_any> listvalue = values->vx_list(); for (vx_core::Type_any value : listvalue) { if (value != vx_core::c_nothing) { vx_core::Type_any any = fn_any_from_any->vx_any_from_any(value); output = vx_core::vx_any_from_any(generic_any_1, any); break; } }" :js "output = " nothing " const fn = fn_any_from_any['vx_value'] if (fn) { for (let index=0;index < values.length;index++) { output = fn(generic, values[index]) if (output != " nothing ") { break } } }" :java "List<Core.Type_any> listvalue = values.vx_list(); for (Core.Type_any value : listvalue) { if (value != Core.c_nothing) { output = fn_any_from_any.vx_any_from_any(generic_any_1, value); break; } }") :doc "Returns first value that is not nothing" :test (test "b" (first<-list-any<-any (list nothing "b" "c") resolve)))
vx/core / float<-string
Description:
  • Returns float from a given string.
Function Name:
  • float<-string
Return Type:
  • vx/core/float
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
Usage/Test Cases:
  • (test (float 2.3) (float<-string "2.3"))
Source Code:
  • (func float<-string : float [text : string] (native :cpp "float num = vx_core::vx_float_from_string(text->vx_string()); output = vx_core::vx_new_float(num);" :js "vx_core.vx_float_from_string(text);" :java "float num = Core.vx_float_from_string(text.vx_string()); output = Core.vx_new_float(num);") :test (test (float 2.3) (float<-string "2.3")) :doc "Returns float from a given string.")
vx/core / fn
Description:
  • Shell for lambda function calls
Function Name:
  • fn
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    params
    vx/core/arglist
    fn-any
    vx/core/any<-func
Usage/Test Cases:
Source Code:
  • (func fn : any-1 [params : arglist fn-any : any<-func] :doc "Shell for lambda function calls")
vx/core / funcdef<-func
Description:
Function Name:
  • funcdef<-func
Return Type:
  • vx/core/funcdef
Arguments:
  • Name
    Type
    Generic
    Description
    val
    vx/core/func
Usage/Test Cases:
Source Code:
  • (func funcdef<-func : funcdef [val : func] (native :cpp "val->vx_funcdef();" :java "val.vx_funcdef();"))
vx/core / funcname<-funcdef
Description:
  • Get the name of a given funcdef
Function Name:
  • funcname<-funcdef
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    funcdef
    vx/core/funcdef
Usage/Test Cases:
Source Code:
  • (func funcname<-funcdef : string [funcdef : funcdef] (string (:pkgname funcdef) "/" (:name funcdef)) :doc "Get the name of a given funcdef")
vx/core / if
Description:
  • Logical If function
Function Name:
  • if
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    clause
    vx/core/boolean
    then
    vx/core/any-1
Usage/Test Cases:
  • (test "a" (if (= 2 2) "a"))
  • (test "" (if : string (= 1 2) "a"))
Source Code:
  • (func if : any-1 [clause : boolean then : any-1] (native :cpp "if (clause->vx_boolean()) { output = then; }" :js "if (clause) { output = then }" :java "if (clause.vx_boolean()) { output = then; }") :test (test "a" (if (= 2 2) "a")) (test "" (if : string (= 1 2) "a")) :doc "Logical If function")
vx/core / if
Description:
  • Logical If function
Function Name:
  • if
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    clause
    vx/core/boolean
    thenval
    vx/core/any-1
    elseval
    vx/core/any-1
Usage/Test Cases:
  • (test "a" (if (= 2 2) "a" "b"))
  • (test "b" (if (= 1 2) "a" "b"))
Source Code:
  • (func if : any-1 [clause : boolean thenval : any-1 elseval : any-1] (native :cpp "if (clause->vx_boolean()) { output = thenval; } else { output = elseval; }" :js "if (clause) { output = thenval } else { output = elseval }" :java "if (clause.vx_boolean()) { output = thenval; } else { output = elseval; }") :test (test "a" (if (= 2 2) "a" "b")) (test "b" (if (= 1 2) "a" "b")) :doc "Logical If function")
vx/core / if
Description:
  • Logical If function
Function Name:
  • if
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    thenelselist
    vx/core/thenelselist
Usage/Test Cases:
  • (test-true (if (then (= 2 3) false) (then (!= 3 3) false) (else (! false))))
Source Code:
  • (func if : any-1 [thenelselist : thenelselist :...] (native :cpp "vx_core::Type_any any = vx_core::vx_if_thenelselist(generic_any_1, thenelselist); output = vx_core::vx_any_from_any(generic_any_1, any);" :js "let fn_any = null for (const thenelseval of thenelselist) { const thenelse = thenelseval['vx_value'] const code = thenelse['code'] switch (code) { case ':then': const fn_cond = thenelse['fn-cond'] const fn = fn_cond['vx_value'] const cond = fn() if (cond == true) { fn_any = thenelse['fn-any'] } break case ':else': fn_any = thenelse['fn-any'] break } if (fn_any != null) { const fn = fn_any['vx_value'] output = fn() break } }" :java "Core.Func_any_from_func fn_any = Core.Class_list.vx_any_first_from_list_fn(Core.t_any_from_func, thenelselist, (any) -> { Core.Func_any_from_func fnany = null; if (any instanceof Core.Type_thenelse) { Core.Type_thenelse thenelse = (Core.Type_thenelse)any; Core.Type_string code = thenelse.code(); switch (code.vx_string()) { case “:then”: Core.Func_boolean_from_func fn_cond = thenelse.fn_cond(); Core.Type_boolean cond = fn_cond.vx_boolean_from_func(); if (cond.vx_boolean() == true) { fnany = thenelse.fn_any(); } break; case “:else”: fnany = thenelse.fn_any(); break; } } return fnany; }); if (fn_any != null) { output = fn_any.vx_any_from_func(generic_any_1); }") :doc "Logical If function" :test (test-true (if (then (= 2 3) false) (then (!= 3 3) false) (else (! false)))))
vx/core / int<-func
Description:
  • Function Type returning int with any parameters
Function Name:
  • int<-func
Return Type:
  • vx/core/int
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func int<-func : int [] :doc "Function Type returning int with any parameters")
vx/core / int<-string
Description:
  • Function Type converting string to int
Function Name:
  • int<-string
Return Type:
  • vx/core/int
Arguments:
  • Name
    Type
    Generic
    Description
    val
    vx/core/string
Usage/Test Cases:
  • (test 4 (int<-string "4"))
  • (test 5 (int<-string "5.4"))
  • (test 5 (int<-string "5.9"))
  • (test notanumber (int<-string "notanumber"))
  • (test infinity (int<-string "infinity"))
  • (test neginfinity (int<-string "neginfinity"))
Source Code:
  • (func int<-string : int [val : string] (switch : int val (case "notanumber" notanumber) (case "infinity" infinity) (case "neginfinity" neginfinity) (else (native :cpp "// :capture val vx_core::Type_int intresult = vx_core::e_int; try { std::string sval = val->vx_string(); long ival = std::stoll(sval); intresult = vx_core::vx_new_int(ival); } catch (std::exception ex) { intresult = vx_core::c_notanumber; } return intresult;" :js "parseInt(val)" :java "int intresult = 0; String strval = val.vx_string(); try { float floatresult = Float.parseFloat(strval); intresult = (int)floatresult; return Core.vx_new_int(intresult); } catch (Exception ex) { return Core.c_notanumber; }" ) ) ) :test (test 4 (int<-string "4")) (test 5 (int<-string "5.4")) (test 5 (int<-string "5.9")) (test notanumber (int<-string "notanumber")) (test infinity (int<-string "infinity")) (test neginfinity (int<-string "neginfinity")) :doc "Function Type converting string to int")
vx/core / is-empty
Description:
  • Returns true if text is empty.
Function Name:
  • is-empty
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func is-empty : boolean [text : string] (native :cpp "if (text->vx_p_iref == -2) { output = vx_core::c_true; }" :js "if (text.length == 0) { output = vx_core.c_true }" :java "if (text.vx_string().length() == 0) { output = Core.c_true; }") :doc "Returns true if text is empty.")
vx/core / is-empty
Description:
  • Returns true if an value is empty
Function Name:
  • is-empty
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any
Usage/Test Cases:
  • (test-true (is-empty ""))
  • (test-true (is-empty (list)))
  • (test-true (is-empty (map)))
Source Code:
  • (func is-empty : boolean [value : any] (native :cpp "if (value == value->vx_empty()) { output = vx_core::c_true; }" :js "const type = vx_core.f_type_from_any(value) if (value == vx_core.f_empty(type)) { output = vx_core.c_true } else { output = vx_core.c_false }" :java "if (value == value.vx_empty()) { output = Core.c_true; } else { output = Core.c_false; }") :test (test-true (is-empty "")) (test-true (is-empty (list))) (test-true (is-empty (map))) :doc "Returns true if an value is empty")
vx/core / is-endswith
Description:
  • Returns true if text ends with find.
Function Name:
  • is-endswith
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    find
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func is-endswith : boolean [text : string find : string] (native :cpp "std::string stext = text->vx_string(); std::string sfind = find->vx_string(); if (vx_core::vx_boolean_from_string_ends(stext, sfind)) { output = vx_core::c_true; }" :js "if (text.endsWith(find)) { output = vx_core.c_true }" :java "String stext = text.vx_string(); String sfind = find.vx_string(); if (stext.endsWith(sfind)) { output = Core.c_true; }") :doc "Returns true if text ends with find.")
vx/core / is-func
Description:
  • Returns true if val is a function.
Function Name:
  • is-func
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    val
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func is-func : boolean [val : any] (native :cpp "vx_core::Type_string extend = " (extends<-any val) "; std::string sextend = extend->vx_string(); vx_core::vx_release(extend); if (sextend == “:func”) { output = vx_core::c_true; }" :js "const extend = " (extends<-any val) " if (extend == ':func') { output = vx_core.c_true }" :java "if (val instanceof Core.Type_func) { output = Core.c_true; }") :doc "Returns true if val is a function.")
vx/core / is-int
Description:
  • Returns true if the value is an integer.
Function Name:
  • is-int
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any
Usage/Test Cases:
  • (test-true (is-int 2))
  • (test-true (is-int "2"))
  • (test-true (is-int infinity))
  • (test-true (is-int "infinity"))
Source Code:
  • (func is-int : boolean [value : any] (native :cpp "bool result = vx_core::vx_is_int(value); output = vx_core::vx_new_boolean(result);" :js "vx_core.vx_is_int(value)" :java "boolean result = Core.vx_is_int(value); output = Core.vx_new_boolean(result);") :test (test-true (is-int 2)) (test-true (is-int "2")) (test-true (is-int infinity)) (test-true (is-int "infinity")) :doc "Returns true if the value is an integer.")
vx/core / is-float
Description:
  • Returns true if the value is a float.
Function Name:
  • is-float
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func is-float : boolean [value : any] (native :cpp "bool result = vx_core::vx_is_float(value); output = vx_core::vx_new_boolean(result);" :js "vx_core.vx_is_float(value)" :java "boolean result = Core.vx_is_float(value); output = Core.vx_new_boolean(result);") :doc "Returns true if the value is a float.")
vx/core / is-number
Description:
  • Return true if val is a number
Function Name:
  • is-number
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any
Usage/Test Cases:
  • (test-true (is-number 5))
  • (test-true (is-number 5.5))
  • (test-false (is-number "a"))
Source Code:
  • (func is-number : boolean [value : any] (switch : boolean (typename<-any value) (case (list "vx/core/decimal" "vx/core/float" "vx/core/int" "vx/core/number") true) (else false)) :test (test-true (is-number 5)) (test-true (is-number 5.5)) (test-false (is-number "a")) :doc "Return true if val is a number")
vx/core / is-pass<-permission
Description:
  • Returns true if permission passes.
Function Name:
  • is-pass<-permission
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    permission
    vx/core/permission
Usage/Test Cases:
Source Code:
  • (func is-pass<-permission : boolean [permission : permission] (let : boolean [id : string := (:id permission) lookup : permission := (permission<-id-context id)] (= lookup permission)) :context :doc "Returns true if permission passes.")
vx/core / last<-list
Description:
  • Returns last value
Function Name:
  • last<-list
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    values
    vx/core/list-1
Usage/Test Cases:
  • (test "c" (last<-list (list "b" "c")))
Source Code:
  • (func last<-list : any-1 [values : list-1] (let [len : int := (length<-list values)] (any<-list values len)) :doc "Returns last value" :test (test "c" (last<-list (list "b" "c"))))
vx/core / length<-list
Description:
  • Returns the currently used size/length of a list
Function Name:
  • length<-list
Return Type:
  • vx/core/int
Arguments:
  • Name
    Type
    Generic
    Description
    values
    vx/core/list-1
Usage/Test Cases:
  • (test 3 (length<-list (stringlist "a" "b" "c")))
Source Code:
  • (func length<-list : int [values : list-1] (native :cpp "long len = vx_core::vx_int_from_sizet(values->vx_list().size()); if (len > 0) { output = vx_core::vx_new_int(len); }" :js "values.length" :java "int intresult = values.vx_list().size(); output = Core.vx_new_int(intresult);") :doc "Returns the currently used size/length of a list" :test (test 3 (length<-list (stringlist "a" "b" "c"))))
vx/core / let
Description:
Function Name:
  • let
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    args
    vx/core/arglist
    fn-any
    vx/core/any<-func
Usage/Test Cases:
  • (test 7 (let [v1 : int := 2 v2 : int := (+ v1 3)] (+ v1 v2)))
Source Code:
  • (func let : any-1 [args : arglist fn-any : any<-func :: any-1] (native :cpp "vx_core::Type_any any = fn_any->vx_any_from_func(); output = vx_core::vx_any_from_any(generic_any_1, any);" :js "const fn = fn_any['vx_value'] if (fn) { output = fn() }" :java "fn_any.vx_any_from_func(generic_any_1);") :test (test 7 (let [v1 : int := 2 v2 : int := (+ v1 3)] (+ v1 v2))))
vx/core / let-async
Description:
  • Same as normal let but returns async values.
Function Name:
  • let-async
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    args
    vx/core/arglist
    fn-any-async
    vx/core/any<-func-async
Usage/Test Cases:
Source Code:
  • (func let-async : any-1 :async [args : arglist fn-any-async : any<-func-async] (native :cpp "fn_any_async->vx_any_from_func_async(generic_any_1);" :js "const fn = fn_any_async['vx_value'] if (fn) { output = await fn() }" :java "fn_any_async.vx_any_from_func_async(generic_any_1);") :doc "Same as normal let but returns async values.")
vx/core / list<-list
Description:
  • Returns a list of processed items from another list
Function Name:
  • list<-list
Return Type:
  • vx/core/list-1
Arguments:
  • Name
    Type
    Generic
    Description
    values
    vx/core/list-2
    fn-any<-any
    vx/core/any<-any
Usage/Test Cases:
Source Code:
  • (func list<-list : list-1 [values : list-2 fn-any<-any : any<-any] (native :cpp "vx_core::vx_Type_listany list_value = values->vx_list(); vx_core::vx_Type_listany list_result = vx_core::vx_listany_from_listany_fn(list_value, [fn_any_from_any](vx_core::Type_any val) { return fn_any_from_any->vx_any_from_any(val); }); vx_core::Type_any anylist = generic_list_1->vx_new(list_result); output = vx_core::vx_any_from_any(generic_list_1, anylist);" :js "const fn = fn_any_from_any['vx_value'] if (fn) { output = values.map(fn) output['vx_type'] = generic_list_1 }" :java "List<Core.Type_any> list_value = values.vx_list(); List<Core.Type_any> list_result = Core.arraylist_from_arraylist_fn(list_value, (val) -> { return fn_any_from_any.vx_any_from_any(generic_list_1, val); }); output = Core.f_any_from_any(generic_list_1, generic_list_1.vx_new(list_result));") :doc "Returns a list of processed items from another list")
vx/core / list<-list-async
Description:
  • Returns an asynchronous list of the processed asynchronous items from another list
Function Name:
  • list<-list-async
Return Type:
  • vx/core/list-1
Arguments:
  • Name
    Type
    Generic
    Description
    values
    vx/core/list-2
    fn-any<-any-async
    vx/core/any<-any-async
Usage/Test Cases:
Source Code:
  • (func list<-list-async : list-1 :async [values : list-2 fn-any<-any-async : any<-any-async] (native :cpp "vx_core::vx_Type_listany list_value = values->vx_list(); vx_core::vx_Type_listasync list_async_result = vx_core::vx_listasync_from_listany_fn(list_value, [fn_any_from_any_async](vx_core::Type_any val) { return fn_any_from_any_async->vx_any_from_any_async(vx_core::vx_type(val), val); }); output = vx_core::vx_async_new_from_listasync(generic_list_1, list_async_result);" :js "const fn = fn_any_from_any_async['vx_value'] if (fn) { const listfuture = values.map(fn) const future = Promise.all(listfuture) output = await future output['vx_type'] = generic_list_1 }" :java "List<Core.Type_any> list_value = values.vx_list(); List<CompletableFuture<Core.Type_any>> list_async_result = Core.arraylist_from_arraylist_fn(list_value, (val) -> { return fn_any_from_any_async.vx_any_from_any_async(generic_list_1, val); }); CompletableFuture<List<Core.Type_any>> async_list_result = Core.async_arraylist_from_arraylist_async(list_async_result); output = Core.async_from_async_fn(async_list_result, (list_result) -> { X work = Core.f_any_from_any(generic_list_1, generic_list_1.vx_new(list_result)); return work; });") :doc "Returns an asynchronous list of the processed asynchronous items from another list")
vx/core / list-join<-list
Description:
  • Returns a flattened list of processed items from another list
Function Name:
  • list-join<-list
Return Type:
  • vx/core/list-1
Arguments:
  • Name
    Type
    Generic
    Description
    values
    vx/core/list-2
    fn-any<-any
    vx/core/any<-any
Usage/Test Cases:
Source Code:
  • (func list-join<-list : list-1 [values : list-2 fn-any<-any : any<-any] (native :cpp "vx_core::Type_any list = vx_core::vx_list_join_from_list_fn(generic_list_1, values, fn_any_from_any); output = vx_core::vx_any_from_any(generic_list_1, list);" :js "const fn = fn_any_from_any['vx_value'] if (fn) { const listoflist = values.map(fn) output = listoflist.flat() output['vx_type'] = generic_list_1 }" :java "List<Core.Type_any> list_value = values.vx_list(); List<Core.Type_any> list_result = new ArrayList<>(); for (Core.Type_any val : list_value) { Core.Type_any listoflist = fn_any_from_any.vx_any_from_any(generic_list_1, val); if (listoflist instanceof Core.Type_list) { Core.Type_list vallist = (Core.Type_list)listoflist; List<Core.Type_any> listval = vallist.vx_list(); list_result.addAll(listval); } } output = Core.f_any_from_any(generic_list_1, generic_list_1.vx_new(list_result));") :doc "Returns a flattened list of processed items from another list")
vx/core / list<-map
Description:
  • Returns a list from a map by applying a function to each key value.
Function Name:
  • list<-map
Return Type:
  • vx/core/list-1
Arguments:
  • Name
    Type
    Generic
    Description
    valuemap
    vx/core/map-2
    fn-any<-key-value
    vx/core/any<-key-value
Usage/Test Cases:
  • (test (stringlist "a1" "b2") (list<-map : stringlist (stringmap "a" "1" "b" "2") (fn : string [key : string val : string] (string key val))))
Source Code:
  • (func list<-map : list-1 [valuemap : map-2 fn-any<-key-value : any<-key-value] (native :cpp "vx_core::Type_any list = vx_core::vx_list_from_map_fn(generic_list_1, valuemap, fn_any_from_key_value); output = vx_core::vx_any_from_any(generic_list_1, list);" :js "vx_core.vx_list_from_map_fn(generic_list_1, valuemap, fn_any_from_key_value)" :java "Map<String, Core.Type_any> map_value = valuemap.vx_map(); List<Core.Type_any> listresult = Core.arraylist_from_linkedhashmap_fn(map_value, (key, val) -> { Core.Type_string valkey = Core.vx_new_string(key); return fn_any_from_key_value.vx_any_from_key_value(Core.t_any, valkey, val); }); output = Core.f_any_from_any(generic_list_1, generic_list_1.vx_new(listresult));") :test (test (stringlist "a1" "b2") (list<-map : stringlist (stringmap "a" "1" "b" "2") (fn : string [key : string val : string] (string key val)))) :doc "Returns a list from a map by applying a function to each key value.")
vx/core / list<-map-async
Description:
Function Name:
  • list<-map-async
Return Type:
  • vx/core/list-1
Arguments:
  • Name
    Type
    Generic
    Description
    valuemap
    vx/core/map-2
    fn-any<-key-value-async
    vx/core/any<-key-value-async
Usage/Test Cases:
Source Code:
  • (func list<-map-async : list-1 :async [valuemap : map-2 fn-any<-key-value-async : any<-key-value-async])
vx/core / list<-type
Description:
  • Create an empty list from a type. Used internally for default lists
Function Name:
  • list<-type
Return Type:
  • vx/core/any
Arguments:
  • Name
    Type
    Generic
    Description
    type
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func list<-type : any [type : any] (native :js "output = [] output['vx_type'] = type") :doc "Create an empty list from a type. Used internally for default lists")
vx/core / log
Description:
  • Writes a value to the console.
Function Name:
  • log
Return Type:
  • vx/core/any
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func log : any [value : any] (native :cpp "vx_core::vx_log(value); output = value;" :js "const text = vx_core.f_string_from_any(value) console.log(text) output = value" :java "Core.Type_string stringtext = Core.f_string_from_any(value); String text = stringtext.vx_string(); System.out.println(text); output = value;") :doc "Writes a value to the console.")
vx/core / log
Description:
  • Writes a string and a value to the console.
Function Name:
  • log
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    value
    vx/core/any-1
Usage/Test Cases:
Source Code:
  • (func log : any-1 [text : string value : any-1] (native :cpp "vx_core::vx_log(text); vx_core::vx_log(value); output = value;" :js "console.log(text) const svalue = vx_core.f_string_from_any(value) console.log(svalue) output = value" :java "Core.vx_log(text); Core.vx_log(value); output = value;") :doc "Writes a string and a value to the console.")
vx/core / main
Description:
  • The default function for app main execution. Arguments come from the command line.
Function Name:
  • main
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    args
    vx/core/anylist
Usage/Test Cases:
Source Code:
  • (func main : string [args : anylist :...] (string args) :doc "The default function for app main execution. Arguments come from the command line.")
vx/core / map<-list
Description:
  • Returns a map from a list by applying a function to generate a key for each value.
Function Name:
  • map<-list
Return Type:
  • vx/core/map-1
Arguments:
  • Name
    Type
    Generic
    Description
    vallist
    vx/core/list-2
    fn-any<-any
    vx/core/any<-any
Usage/Test Cases:
  • (test (stringmap "keya" "a" "keyb" "b") (map<-list : stringmap (stringlist "a" "b") (fn : string [val : string] (string "key" val))))
Source Code:
  • (func map<-list : map-1 [vallist : list-2 fn-any<-any : any<-any :: string] (native :cpp "vx_core::vx_Type_listany listany = vallist->vx_list(); vx_core::vx_Type_mapany mapany = vx_core::vx_map_from_list(listany, fn_any_from_any); output = vx_core::vx_new_from_map(generic_map_1, mapany);" :js "const valmap = {} vallist.map(value => { const fn = fn_any_from_any['vx_value'] if (fn) { const key = fn(value) valmap[key] = value } }) output = { vx_type: generic_map_1, vx_value: valmap }" :java "List<Core.Type_any> listval = vallist.vx_list(); Map<String, Core.Type_any> mapresult = Core.vx_map_from_list_fn(listval, (val) -> { return fn_any_from_any.vx_any_from_any(Core.t_string, val); }); output = Core.f_any_from_any(generic_map_1, output.vx_new_from_map(mapresult));") :test (test (stringmap "keya" "a" "keyb" "b") (map<-list : stringmap (stringlist "a" "b") (fn : string [val : string] (string "key" val)))) :doc "Returns a map from a list by applying a function to generate a key for each value.")
vx/core / map<-map
Description:
  • Returns a map from a map by applying a function to each key value.
Function Name:
  • map<-map
Return Type:
  • vx/core/map-1
Arguments:
  • Name
    Type
    Generic
    Description
    valuemap
    vx/core/map-2
    fn-any<-key-value
    vx/core/any<-key-value
Usage/Test Cases:
  • (test (stringmap :a "a1" :b "b2") (map<-map : stringmap (stringmap :a "1" :b "2") (fn : string [key : string val : string] (string key val))))
Source Code:
  • (func map<-map : map-1 [valuemap : map-2 fn-any<-key-value : any<-key-value] (native :cpp "vx_core::Type_any map = vx_core::vx_map_from_map_fn(generic_map_1, valuemap, fn_any_from_key_value); output = vx_core::vx_any_from_any(generic_map_1, map);" :js "vx_core.vx_map_from_map_fn(generic_map_1, valuemap, fn_any_from_key_value)" :java "Core.vx_map_from_map_fn(generic_map_1, valuemap, fn_any_from_key_value);") :test (test (stringmap :a "a1" :b "b2") (map<-map : stringmap (stringmap :a "1" :b "2") (fn : string [key : string val : string] (string key val)))) :doc "Returns a map from a map by applying a function to each key value.")
vx/core / mempool-addref
Description:
  • Add Value Reference
Function Name:
  • mempool-addref
Return Type:
  • vx/core/none
Arguments:
  • Name
    Type
    Generic
    Description
    values
    vx/core/anylist
Usage/Test Cases:
Source Code:
  • (func mempool-addref : none [values : anylist :...] (native :js "for (const value of values) { const value = values[i] if (value.refs) { value.refs += 1 } }") :doc "Add Value Reference")
vx/core / mempool-reserve
Description:
  • Returns a recycled Value or creates a new one.
Function Name:
  • mempool-reserve
Return Type:
  • vx/core/value
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func mempool-reserve : value [] (native :js "mempool = " mempool-active " output = mempool.valuepool if (output == null) { output = { refs: 0 } } else { const next = output.next if (next == null) { mempool.valuepool = null } else { mempool.valuepool = next output.next = null } }") :doc "Returns a recycled Value or creates a new one.")
vx/core / mempool-release
Description:
  • Recycles a Value and adds it to the valuepool.
Function Name:
  • mempool-release
Return Type:
  • vx/core/none
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/value
Usage/Test Cases:
Source Code:
  • (func mempool-release : none [value : value] (native :js "const mempool = " mempool-active " value.length = 0 for (const key in value) { delete value[key] } next = mempool.valuepool value.next = next mempool.valuepool = value") :doc "Recycles a Value and adds it to the valuepool.")
vx/core / mempool-removeref
Description:
  • Remove Value Reference
Function Name:
  • mempool-removeref
Return Type:
  • vx/core/none
Arguments:
  • Name
    Type
    Generic
    Description
    values
    vx/core/anylist
Usage/Test Cases:
Source Code:
  • (func mempool-removeref : none [values : anylist :...] (native :js "for (const value of values) { const value = values[i] if (value.refs) { value.refs -= 1 if (value.refs == 0) { vx_core.f_mempool_removerefchildren(value) vx_core.f_mempool_recyclevalue(value) } } }") :doc "Remove Value Reference")
vx/core / mempool-removerefchildren
Description:
  • Remove Value Child References
Function Name:
  • mempool-removerefchildren
Return Type:
  • vx/core/none
Arguments:
  • Name
    Type
    Generic
    Description
    values
    vx/core/anylist
Usage/Test Cases:
Source Code:
  • (func mempool-removerefchildren : none [values : anylist :...] (native :js "for (const value of values) { const extend = " (extends<-any value) " switch (extend) { case ':list': vx_core.f_mempool_removeref(...value['vx_value']) break case ':map': case ':struct': vx_core.f_mempool_removeref(...Object.entities(value['vx_value'])) break } }") :doc "Remove Value Child References")
vx/core / msg<-error
Description:
  • Returns a msg from error string
Function Name:
  • msg<-error
Return Type:
  • vx/core/msg
Arguments:
  • Name
    Type
    Generic
    Description
    error
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func msg<-error : msg [error : string] (msg :severity msg-error :text error) :doc "Returns a msg from error string")
vx/core / msg<-error
Description:
  • Returns a msg from error code and detail
Function Name:
  • msg<-error
Return Type:
  • vx/core/msg
Arguments:
  • Name
    Type
    Generic
    Description
    code
    vx/core/string
    detail
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func msg<-error : msg [code : string detail : any] (msg :code code :detail detail :severity msg-error) :doc "Returns a msg from error code and detail")
vx/core / msg<-error
Description:
  • Returns a msg from error path code and detail
Function Name:
  • msg<-error
Return Type:
  • vx/core/msg
Arguments:
  • Name
    Type
    Generic
    Description
    path
    vx/core/string
    code
    vx/core/string
    detail
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func msg<-error : msg [path : string code : string detail : any] (msg :code code :path path :severity msg-error) :doc "Returns a msg from error path code and detail")
vx/core / msg<-warning
Description:
  • Returns a msg from a warning string
Function Name:
  • msg<-warning
Return Type:
  • vx/core/msg
Arguments:
  • Name
    Type
    Generic
    Description
    warning
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func msg<-warning : msg [warning : string] (msg :severity msg-warning :text warning) :doc "Returns a msg from a warning string")
vx/core / msgblock<-msgblock-msg
Description:
  • Return a new Msgblock with the added msg
Function Name:
  • msgblock<-msgblock-msg
Return Type:
  • vx/core/msgblock
Arguments:
  • Name
    Type
    Generic
    Description
    origblock
    vx/core/msgblock
    addmsg
    vx/core/msg
Usage/Test Cases:
Source Code:
  • (func msgblock<-msgblock-msg : msgblock [origblock : msgblock addmsg : msg] (copy origblock addmsg) :doc "Return a new Msgblock with the added msg")
vx/core / msgblock<-msgblock-msgblock
Description:
  • Return a new Msgblock with the added block
Function Name:
  • msgblock<-msgblock-msgblock
Return Type:
  • vx/core/msgblock
Arguments:
  • Name
    Type
    Generic
    Description
    origblock
    vx/core/msgblock
    addblock
    vx/core/msgblock
Usage/Test Cases:
Source Code:
  • (func msgblock<-msgblock-msgblock : msgblock [origblock : msgblock addblock : msgblock] (msgblock origblock addblock) :doc "Return a new Msgblock with the added block")
vx/core / name<-typedef
Description:
  • Returns the name from a typedef.
Function Name:
  • name<-typedef
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    vtypedef
    vx/core/typedef
Usage/Test Cases:
Source Code:
  • (func name<-typedef : string [vtypedef : typedef] (:name vtypedef) :doc "Returns the name from a typedef.")
vx/core / native
Description:
  • Native Function Call
Function Name:
  • native
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    clauses
    vx/core/anylist
Usage/Test Cases:
Source Code:
  • (func native : any-1 [clauses : anylist :...] :doc "Native Function Call")
vx/core / native<-any
Description:
  • Returns native value of value object
Function Name:
  • native<-any
Return Type:
  • vx/core/any
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any-1
Usage/Test Cases:
Source Code:
  • (func native<-any : any [value : any-1] (native :js "output = value switch (typeof value) { case 'boolean': case 'number': case 'string': break default: const extend = " (extends<-any value) " switch (extend) { case ':list': output = [...value] break case ':func': case ':map': case ':struct': output = value['vx_value'] break } break }") :doc "Returns native value of value object")
vx/core / new
Description:
  • Create a new Value of Type A
Function Name:
  • new
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    type
    vx/core/any-1
    values
    vx/core/anylist
Usage/Test Cases:
  • (test true (new boolean true))
  • (test 4 (new int 4))
  • (test 5.4 (new float 5.4))
  • (test "a" (new string "a"))
  • (test (stringlist "a" "b" "c") (new stringlist "a" "b" "c"))
  • (test (stringmap :a "1" :b "2") (new stringmap :a "1" :b "2"))
Source Code:
  • (func new : any-1 [type : any-1 values : anylist :...] (native :cpp "T* output = vx_core::vx_new(type, values->vx_list());" :js "vx_core.vx_new(type, values)" :java "Core.Type_any[] arrayany = Core.arrayany_from_anylist(values); Object[] arrayobj = (Core.Type_any[])arrayany; T output = (T)(type.vx_new(arrayobj));") :doc "Create a new Value of Type A" :test (test true (new boolean true)) (test 4 (new int 4)) (test 5.4 (new float 5.4)) (test "a" (new string "a")) (test (stringlist "a" "b" "c") (new stringlist "a" "b" "c")) (test (stringmap :a "1" :b "2") (new stringmap :a "1" :b "2")))
vx/core / number<-func
Description:
  • Function Type returning number with any parameters
Function Name:
  • number<-func
Return Type:
  • vx/core/number
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func number<-func : number [] :doc "Function Type returning number with any parameters")
vx/core / or
Description:
  • Returns true if any value is true
Function Name:
  • or
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    val1
    vx/core/boolean
    val2
    vx/core/boolean
Usage/Test Cases:
  • (test-true (or true true))
  • (test-true (or true false))
  • (test-false (or false false))
Source Code:
  • (func or : boolean [val1 : boolean val2 : boolean] (native :cpp "if (val1->vx_boolean() || val2->vx_boolean()) { output = vx_core::c_true; } else { output = vx_core::c_false; }" :js "if (val1 || val2) { output = true } else { output = false }" :java "if (val1.vx_boolean() || val2.vx_boolean()) { output = Core.c_true; } else { output = Core.c_false; }") :doc "Returns true if any value is true" :test (test-true (or true true)) (test-true (or true false)) (test-false (or false false)))
vx/core / or
Description:
  • Returns true if any value is true
Function Name:
  • or
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    values
    vx/core/booleanlist
Usage/Test Cases:
  • (test-true (or false true false))
  • (test-false (or false false false))
Source Code:
  • (func or : boolean [values : booleanlist :...] (any<-list-start-reduce-next : boolean values false (fn : boolean [reduce : boolean current : boolean next : boolean] (or reduce (or current next)))) :doc "Returns true if any value is true" :test (test-true (or false true false)) (test-false (or false false false)))
vx/core / package-global<-name
Description:
  • Returns a package from global with the given name.
Function Name:
  • package-global<-name
Return Type:
  • vx/core/package
Arguments:
  • Name
    Type
    Generic
    Description
    name
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func package-global<-name : package [name : string] (any<-map (:packagemap global) name) :doc "Returns a package from global with the given name.")
vx/core / packagename<-typedef
Description:
  • Returns the package name from a typedef.
Function Name:
  • packagename<-typedef
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    vtypedef
    vx/core/typedef
Usage/Test Cases:
Source Code:
  • (func packagename<-typedef : string [vtypedef : typedef] (:pkgname vtypedef) :doc "Returns the package name from a typedef.")
vx/core / path<-context-path
Description:
  • Returns a path from a context
Function Name:
  • path<-context-path
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    path
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func path<-context-path : string [path : string] (path<-setting-path (setting<-context) path) :context :doc "Returns a path from a context")
vx/core / path<-setting-path
Description:
  • Returns a path from a setting
Function Name:
  • path<-setting-path
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    session
    vx/core/setting
    path
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func path<-setting-path : string [session : setting path : string] :doc "Returns a path from a setting")
vx/core / permission<-id-context
Description:
  • Return a permission from context by id
Function Name:
  • permission<-id-context
Return Type:
  • vx/core/permission
Arguments:
  • Name
    Type
    Generic
    Description
    id
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func permission<-id-context : permission [id : string] (let [user : user := (user<-context) security : security := (:security user) permissionmap : permissionmap := (:permissionmap security)] (:id permissionmap)) :context :doc "Return a permission from context by id")
vx/core / properties<-typedef
Description:
  • Return property map from typedef
Function Name:
  • properties<-typedef
Return Type:
  • vx/core/argmap
Arguments:
  • Name
    Type
    Generic
    Description
    vtypedef
    vx/core/typedef
Usage/Test Cases:
Source Code:
  • (func properties<-typedef : argmap [vtypedef : typedef] (:properties vtypedef) :doc "Return property map from typedef")
vx/core / proplast<-typedef
Description:
  • Return last property from typedef
Function Name:
  • proplast<-typedef
Return Type:
  • vx/core/arg
Arguments:
  • Name
    Type
    Generic
    Description
    vtypedef
    vx/core/typedef
Usage/Test Cases:
Source Code:
  • (func proplast<-typedef : arg [vtypedef : typedef] (:proplast vtypedef) :doc "Return last property from typedef")
vx/core / resolve
Description:
Function Name:
  • resolve
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any-1
Usage/Test Cases:
  • (test "a" (resolve "a"))
Source Code:
  • (func resolve : any-1 [value : any-1] value :test (test "a" (resolve "a")))
vx/core / resolve
Description:
Function Name:
  • resolve
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    fn-any
    vx/core/any<-func
Usage/Test Cases:
  • (test 4 (resolve (fn : int [] (+ 1 3))))
Source Code:
  • (func resolve : any-1 [fn-any : any<-func] (native :cpp "if (fn_any) { vx_core::Type_any any = fn_any->vx_any_from_func(); output = vx_core::vx_any_from_any(generic_any_1, any); }" :js "const typedef = " (typedef<-any fn-any) " const extend = vx_core.f_extends_from_typedef(typedef) switch (extend) { case ':func': const fn = fn_any['vx_value'] if (fn) { output = fn() } break default: output = fn_any break }" :java "if (fn_any != null) { output = fn_any.vx_any_from_func(generic_any_1); }") :test (test 4 (resolve (fn : int [] (+ 1 3)))))
vx/core / resolve-async
Description:
Function Name:
  • resolve-async
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    fn-any
    vx/core/any<-func-async
Usage/Test Cases:
  • (test 4 (resolve : int (fn : int [] (+ 1 3))))
Source Code:
  • (func resolve-async : any-1 :async [fn-any : any<-func-async] (native :cpp "if (fn_any) { output = fn_any->vx_any_from_func_async(generic_any_1); }" :js "const typedef = " (typedef<-any fn-any) " const extend = vx_core.f_extends_from_typedef(typedef) switch (extend) { case ':func': const fn = fn_any['vx_value'] if (fn) { output = await fn() } break default: output = fn_any break }" :java "if (fn_any != null) { output = fn_any.vx_any_from_func_async(generic_any_1); }") :test (test 4 (resolve : int (fn : int [] (+ 1 3)))))
vx/core / resolve-first
Description:
  • Returns the first value that is not nothing
Function Name:
  • resolve-first
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    clauses
    vx/core/list-1
Usage/Test Cases:
Source Code:
  • (func resolve-first : any-1 [clauses : list-1 :...] (first<-list-any<-any clauses resolve) :doc "Returns the first value that is not nothing")
vx/core / resolve-list
Description:
Function Name:
  • resolve-list
Return Type:
  • vx/core/list-1
Arguments:
  • Name
    Type
    Generic
    Description
    clauses
    vx/core/list-1
Usage/Test Cases:
Source Code:
  • (func resolve-list : list-1 [clauses : list-1] (list<-list clauses resolve))
vx/core / security<-context
Description:
  • Return security from the given context.
Function Name:
  • security<-context
Return Type:
  • vx/core/security
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func security<-context : security (security<-user (user<-context)) :context :doc "Return security from the given context.")
vx/core / security<-user
Description:
  • Return security from the given user.
Function Name:
  • security<-user
Return Type:
  • vx/core/security
Arguments:
  • Name
    Type
    Generic
    Description
    user
    vx/core/user
Usage/Test Cases:
Source Code:
  • (func security<-user : security [user : user] (:security user) :doc "Return security from the given user.")
vx/core / session<-context
Description:
  • Returns session from a context
Function Name:
  • session<-context
Return Type:
  • vx/core/session
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func session<-context : session (:session context) :context :doc "Returns session from a context")
vx/core / setting<-context
Description:
  • Returns setting from a context
Function Name:
  • setting<-context
Return Type:
  • vx/core/setting
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func setting<-context : setting (:setting context) :context :doc "Returns setting from a context")
vx/core / string-repeat
Description:
Function Name:
  • string-repeat
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    repeat
    vx/core/int
Usage/Test Cases:
  • (test "abab" (string-repeat "ab" 2))
Source Code:
  • (func string-repeat : string [text : string repeat : int] (native :cpp "std::string stringtext = vx_core::vx_string_from_string_repeat(text->vx_string(), repeat->vx_int()); output = vx_core::vx_new_string(stringtext);" :js "text.repeat(repeat)" :java "String stringtext = text.vx_string(); int intrepeat = repeat.vx_int(); String stringresult = stringtext.repeat(intrepeat); output = Core.vx_new_string(stringresult);") :test (test "abab" (string-repeat "ab" 2)))
vx/core / string<-any
Description:
  • Return a string representation of a value
Function Name:
  • string<-any
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any
Usage/Test Cases:
  • (test "true" (string<-any true))
  • (test "4" (string<-any 4))
  • (test "5.4" (string<-any 5.4))
  • (test "\"a\"" (string<-any "a"))
  • (test "(stringlist \"a\" \"b\" \"c\")" (string<-any (stringlist "a" "b" "c")))
  • (test "(stringmap :a \"1\" :b \"2\")" (string<-any (stringmap :a "1" :b "2")))
Source Code:
  • (func string<-any : string [value : any] (string<-any-indent value 0 true) :test (test "true" (string<-any true)) (test "4" (string<-any 4)) (test "5.4" (string<-any 5.4)) (test "\"a\"" (string<-any "a")) (test "(stringlist \"a\" \"b\" \"c\")" (string<-any (stringlist "a" "b" "c"))) (test "(stringmap :a \"1\" :b \"2\")" (string<-any (stringmap :a "1" :b "2"))) :doc "Return a string representation of a value")
vx/core / string<-any-indent
Description:
  • Return a string representation of a value
Function Name:
  • string<-any-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any
    indent
    vx/core/int
    linefeed
    vx/core/boolean
Usage/Test Cases:
Source Code:
  • (func string<-any-indent : string [value : any indent : int linefeed : boolean] (native :cpp "std::string soutput = vx_core::vx_string_from_any_indent(value, indent->vx_int(), linefeed->vx_boolean(), false); output = vx_core::vx_new_string(soutput);" :js "output = vx_core.vx_string_from_any_indent(value, indent, linefeed)" :java :auto) :doc "Return a string representation of a value")
vx/core / string<-func
Description:
  • Function Type returning string with any parameters
Function Name:
  • string<-func
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func string<-func : string [] :doc "Function Type returning string with any parameters")
vx/core / string<-string-find-replace
Description:
  • Returns a string with all instances of find replaced by replace.
Function Name:
  • string<-string-find-replace
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    find
    vx/core/string
    replace
    vx/core/string
Usage/Test Cases:
  • (test "a!b!c" (string<-string-find-replace "axybxyc" "xy" "!"))
Source Code:
  • (func string<-string-find-replace : string [text : string find : string replace : string] (native :cpp :auto :java :auto :js :auto) :test (test "a!b!c" (string<-string-find-replace "axybxyc" "xy" "!")) :doc "Returns a string with all instances of find replaced by replace.")
vx/core / switch
Description:
  • Returns a value based on a logical switch
Function Name:
  • switch
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    val
    vx/core/any-2
    thenelselist
    vx/core/thenelselist
Usage/Test Cases:
  • (test 1 (switch : int "d" (case (list "b" "c" "d") 1) (else 2)))
Source Code:
  • (func switch : any-1 [val : any-2 thenelselist : thenelselist :...] (native :cpp "vx_core::Type_any any = vx_core::vx_switch(generic_any_1, val, thenelselist); output = vx_core::vx_any_from_any(generic_any_1, any);" :js "let fn_any = null if (thenelselist.length > 0) { for (let valthenelse of thenelselist) { const thenelse = valthenelse['vx_value'] const code = thenelse['code'] switch (code) { case ':case': const value = thenelse['value'] if (value == val) { fn_any = thenelse['fn-any'] } else if (typeof value == 'number') { // special handling of notanumber if (isNaN(val) && isNaN(value)) { fn_any = thenelse['fn-any'] } } break case ':casemany': const values = thenelse['values'] if (values.includes(val)) { fn_any = thenelse['fn-any'] } break case ':else': fn_any = thenelse['fn-any'] break } if (fn_any != null) { break } } if (fn_any != null) { const fn = fn_any['vx_value'] if (fn) { output = fn() } } }" :java "Core.Func_any_from_func fn_any = null; List<Core.Type_thenelse> listthenelse = thenelselist.vx_listthenelse(); for (Core.Type_thenelse thenelse : listthenelse) { Core.Type_string code = thenelse.code(); switch (code.vx_string()) { case “:case”: Core.Type_any value = thenelse.value(); Core.Type_boolean iseq = Core.f_eq(val, value); if (iseq.vx_boolean()) { fn_any = thenelse.fn_any(); } break; case “:casemany”: Core.Type_list values = thenelse.values(); Core.Type_boolean iscontain = Core.f_contains_1(values, val); if (iscontain.vx_boolean()) { fn_any = thenelse.fn_any(); } break; case “:else”: fn_any = thenelse.fn_any(); break; } if (fn_any != null) { break; } } if (fn_any != null) { output = fn_any.vx_any_from_func(generic_any_1); }") :test (test 1 (switch : int "d" (case (list "b" "c" "d") 1) (else 2))) :doc "Returns a value based on a logical switch")
vx/core / then
Description:
  • Returns a thenelse struct from a given condition function and value function
Function Name:
  • then
Return Type:
  • vx/core/thenelse
Arguments:
  • Name
    Type
    Generic
    Description
    fn-cond
    vx/core/boolean<-func
    fn-any
    vx/core/any<-func
Usage/Test Cases:
Source Code:
  • (func then : thenelse [fn-cond : boolean<-func fn-any : any<-func] (thenelse :code :then :fn-cond fn-cond :fn-any fn-any) :doc "Returns a thenelse struct from a given condition function and value function")
vx/core / traits<-typedef
Description:
  • Return trait list from type
Function Name:
  • traits<-typedef
Return Type:
  • vx/core/typelist
Arguments:
  • Name
    Type
    Generic
    Description
    vtypedef
    vx/core/typedef
Usage/Test Cases:
Source Code:
  • (func traits<-typedef : typelist [vtypedef : typedef] (native :cpp "vtypedef->traits();" :js "vtypedef['vx_value']['traits']" :java "vtypedef.traits();") :doc "Return trait list from type")
vx/core / type<-any
Description:
  • Gets the Type of a given Value
Function Name:
  • type<-any
Return Type:
  • vx/core/any
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any-1
Usage/Test Cases:
  • (test boolean (type<-any false))
  • (test int (type<-any 5))
  • (test string (type<-any "a"))
Source Code:
  • (func type<-any : any [value : any-1] (native :cpp "value->vx_type();" :js "switch (typeof value) { case 'boolean': output = " boolean " break case 'number': switch (value) { case " infinity ": case " neginfinity ": case " notanumber ": output = " int " break default: const strval = '' + value if (strval.indexOf('.') < 0) { output = " int " } else { output = " float " } break } break case 'string': output = " string " break case 'function': output = " func " break default: output = value['vx_type'] if (output == vx_core.t_type) { output = value } break }" :java "output = value.vx_type();") :test (test boolean (type<-any false)) (test int (type<-any 5)) (test string (type<-any "a")) :doc "Gets the Type of a given Value")
vx/core / typedef<-any
Description:
  • Gets the typedef of a given value
Function Name:
  • typedef<-any
Return Type:
  • vx/core/typedef
Arguments:
  • Name
    Type
    Generic
    Description
    val
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func typedef<-any : typedef [val : any] (typedef<-type (type<-any val)) :doc "Gets the typedef of a given value")
vx/core / typedef<-type
Description:
  • Gets the typedef of a given type
Function Name:
  • typedef<-type
Return Type:
  • vx/core/typedef
Arguments:
  • Name
    Type
    Generic
    Description
    val
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func typedef<-type : typedef [val : any] (native :cpp "val->vx_typedef();" :js "output = val" :java "val.vx_typedef();") :doc "Gets the typedef of a given type")
vx/core / typename<-any
Description:
  • Gets the typename of a given value
Function Name:
  • typename<-any
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any-2
Usage/Test Cases:
  • (test "vx/core/boolean" (typename<-any false))
  • (test "vx/core/int" (typename<-any 5))
  • (test "vx/core/string" (typename<-any "a"))
Source Code:
  • (func typename<-any : string [value : any-2] (typename<-type (type<-any value)) :test (test "vx/core/boolean" (typename<-any false)) (test "vx/core/int" (typename<-any 5)) (test "vx/core/string" (typename<-any "a")) :doc "Gets the typename of a given value")
vx/core / typename<-type
Description:
  • Get the name of a given type
Function Name:
  • typename<-type
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    type
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func typename<-type : string [type : any] (typename<-typedef (typedef<-type type)) :doc "Get the name of a given type")
vx/core / typename<-typedef
Description:
  • Get the name of a given type
Function Name:
  • typename<-typedef
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    vtypedef
    vx/core/typedef
Usage/Test Cases:
Source Code:
  • (func typename<-typedef : string [vtypedef : typedef] (string (:pkgname vtypedef) "/" (:name vtypedef)) :doc "Get the name of a given type")
vx/core / typenames<-typelist
Description:
  • Get the names from a type list
Function Name:
  • typenames<-typelist
Return Type:
  • vx/core/stringlist
Arguments:
  • Name
    Type
    Generic
    Description
    typelist
    vx/core/typelist
Usage/Test Cases:
Source Code:
  • (func typenames<-typelist : stringlist [typelist : typelist] (list<-list : stringlist typelist (fn : string [type : any] (typename<-type type))) :doc "Get the names from a type list")
vx/core / user<-context
Description:
  • Returns the current user from context.
Function Name:
  • user<-context
Return Type:
  • vx/core/user
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func user<-context : user (:user (session<-context)) :context :doc "Returns the current user from context.")
vx/data/csv
Description:
  • Csv handler
Package Name:
  • vx/data/csv
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    collection
    vx/collection
    fil
    vx/data/file
    tb
    vx/data/textblock
    type
    vx/type
Types:
  • csv, csvrowmap, csvrows
Constants:
  • delimcsv
Functions:
  • csv<-file, csv<-string, csv<-textblock, csv-read<-file, csvrows<-textblock, stringmap<-csv, textblock-csv<-string
Source Code:
  • (package vx/data/csv :libs (lib collection :path vx/collection) (lib fil :path vx/data/file) (lib tb :path vx/data/textblock) (lib type :path vx/type) :doc "Csv handler") (type csv : struct :properties [headers : stringlist rows : csvrows]) (type csvrowmap : map :allowtypes [stringlist]) (type csvrows : list :allowtypes [stringlist]) (const delimcsv : tb/delim (tb/delim :name "delimcsv" :delimlist (tb/delimlist tb/delimline tb/delimquote tb/delimcomma)) :doc "Csv File Delimiters") (func csv<-file : csv [file : fil/file] (let : csv [text : string := (:text file)] (csv<-string text)) :doc "Returns a parsed csv from a file.") (func csv<-string : csv [text : string] (csv<-textblock (tb/textblock-parse<-string-delim text delimcsv)) :doc "Returns a parsed csv from a string.") (func csv<-textblock : csv [textblock : tb/textblock] (let [allrows : csvrows := (csvrows<-textblock textblock) headers : stringlist := (:1 allrows) rows : csvrows := (list<-list-end allrows 2)] (csv :headers headers :rows rows)) :doc "Returns a parsed csv from a textblock.") (func csv-read<-file : csv [file : fil/file] (let : csv [loaded : fil/file := (fil/file-read<-file file)] (csv<-file loaded)) :context :doc "Returns a parsed csv from a file.") (func csvrows<-textblock : csvrows [textblock : tb/textblock] (let [parsedtb : tb/textblock := (tb/textblock<-textblock-delim textblock delimcsv) children : tb/textblocklist := (tb/children<-textblock parsedtb) strings : stringlist := (tb/stringlist<-textblocklist children)] (csvrows strings))) (func stringmap<-csv : stringmap [csv : csv] (let : stringmap [rows : csvrows := (:rows csv) rowmap : csvrowmap := (map<-list : csvrowmap rows (fn : string [textlist : stringlist] (:1 textlist)))] (map<-map : stringmap rowmap (fn : stringmap [key : string val : stringlist] (:2 val)))) :doc "Returns a stringmap using the first 2 values in each row.") (func textblock-csv<-string : textblock [text : string] (tb/textblock-parse<-string-delim text delimcsv) :test (test (tb/textblock :text `"a","b" 1,"2"` :startpos 1 :endpos 13 :children (tb/textblocklist (tb/textblock :text `"a"` :startpos 1 :endpos 3 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "a" :startpos 2 :endpos 2))) (tb/textblock :text "," :startpos 4 :endpos 4 :delim (copy tb/delimcomma :pos 0)) (tb/textblock :text `"b"` :startpos 5 :endpos 7 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "b" :startpos 6 :endpos 6))) (tb/textblock :text "\n" :startpos 8 :endpos 8 :delim (copy tb/delimline :pos 0)) (tb/textblock :text "1" :startpos 9 :endpos 9) (tb/textblock :text "," :startpos 10 :endpos 10 :delim (copy tb/delimcomma :pos 0)) (tb/textblock :text `"2"` :startpos 11 :endpos 13 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "2" :startpos 12 :endpos 12))))) (textblock-csv<-string `"a","b" 1,"2"`)) :doc "Returns a parsed csv-textblock from a string.")
vx/data/csv / csv
Description:
Type Name:
  • csv
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    headers
    vx/core/stringlist
    false
    false
    rows
    vx/data/csv/csvrows
    false
    false
Usage/Test Cases:
Source Code:
  • (type csv : struct :properties [headers : stringlist rows : csvrows])
vx/data/csv / csvrowmap
Description:
Type Name:
  • csvrowmap
Extends:
  • :map
Default:
Allowed Types:
  • stringlist
Usage/Test Cases:
Source Code:
  • (type csvrowmap : map :allowtypes [stringlist])
vx/data/csv / csvrows
Description:
Type Name:
  • csvrows
Extends:
  • :list
Default:
Allowed Types:
  • stringlist
Usage/Test Cases:
Source Code:
  • (type csvrows : list :allowtypes [stringlist])
vx/data/csv / delimcsv
Description:
  • Csv File Delimiters
Constant Name:
  • delimcsv
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimcsv : tb/delim (tb/delim :name "delimcsv" :delimlist (tb/delimlist tb/delimline tb/delimquote tb/delimcomma)) :doc "Csv File Delimiters")
vx/data/csv / csv<-file
Description:
  • Returns a parsed csv from a file.
Function Name:
  • csv<-file
Return Type:
  • vx/data/csv/csv
Arguments:
  • Name
    Type
    Generic
    Description
    file
    vx/data/file/file
Usage/Test Cases:
Source Code:
  • (func csv<-file : csv [file : fil/file] (let : csv [text : string := (:text file)] (csv<-string text)) :doc "Returns a parsed csv from a file.")
vx/data/csv / csv<-string
Description:
  • Returns a parsed csv from a string.
Function Name:
  • csv<-string
Return Type:
  • vx/data/csv/csv
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func csv<-string : csv [text : string] (csv<-textblock (tb/textblock-parse<-string-delim text delimcsv)) :doc "Returns a parsed csv from a string.")
vx/data/csv / csv<-textblock
Description:
  • Returns a parsed csv from a textblock.
Function Name:
  • csv<-textblock
Return Type:
  • vx/data/csv/csv
Arguments:
  • Name
    Type
    Generic
    Description
    textblock
    vx/data/textblock/textblock
Usage/Test Cases:
Source Code:
  • (func csv<-textblock : csv [textblock : tb/textblock] (let [allrows : csvrows := (csvrows<-textblock textblock) headers : stringlist := (:1 allrows) rows : csvrows := (list<-list-end allrows 2)] (csv :headers headers :rows rows)) :doc "Returns a parsed csv from a textblock.")
vx/data/csv / csv-read<-file
Description:
  • Returns a parsed csv from a file.
Function Name:
  • csv-read<-file
Return Type:
  • vx/data/csv/csv
Arguments:
  • Name
    Type
    Generic
    Description
    file
    vx/data/file/file
Usage/Test Cases:
Source Code:
  • (func csv-read<-file : csv [file : fil/file] (let : csv [loaded : fil/file := (fil/file-read<-file file)] (csv<-file loaded)) :context :doc "Returns a parsed csv from a file.")
vx/data/csv / csvrows<-textblock
Description:
Function Name:
  • csvrows<-textblock
Return Type:
  • vx/data/csv/csvrows
Arguments:
  • Name
    Type
    Generic
    Description
    textblock
    vx/data/textblock/textblock
Usage/Test Cases:
Source Code:
  • (func csvrows<-textblock : csvrows [textblock : tb/textblock] (let [parsedtb : tb/textblock := (tb/textblock<-textblock-delim textblock delimcsv) children : tb/textblocklist := (tb/children<-textblock parsedtb) strings : stringlist := (tb/stringlist<-textblocklist children)] (csvrows strings)))
vx/data/csv / stringmap<-csv
Description:
  • Returns a stringmap using the first 2 values in each row.
Function Name:
  • stringmap<-csv
Return Type:
  • vx/core/stringmap
Arguments:
  • Name
    Type
    Generic
    Description
    csv
    vx/data/csv/csv
Usage/Test Cases:
Source Code:
  • (func stringmap<-csv : stringmap [csv : csv] (let : stringmap [rows : csvrows := (:rows csv) rowmap : csvrowmap := (map<-list : csvrowmap rows (fn : string [textlist : stringlist] (:1 textlist)))] (map<-map : stringmap rowmap (fn : stringmap [key : string val : stringlist] (:2 val)))) :doc "Returns a stringmap using the first 2 values in each row.")
vx/data/csv / textblock-csv<-string
Description:
  • Returns a parsed csv-textblock from a string.
Function Name:
  • textblock-csv<-string
Return Type:
  • vx/data/textblock/textblock
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
Usage/Test Cases:
  • (test (tb/textblock :text `"a","b" 1,"2"` :startpos 1 :endpos 13 :children (tb/textblocklist (tb/textblock :text `"a"` :startpos 1 :endpos 3 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "a" :startpos 2 :endpos 2))) (tb/textblock :text "," :startpos 4 :endpos 4 :delim (copy tb/delimcomma :pos 0)) (tb/textblock :text `"b"` :startpos 5 :endpos 7 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "b" :startpos 6 :endpos 6))) (tb/textblock :text "\n" :startpos 8 :endpos 8 :delim (copy tb/delimline :pos 0)) (tb/textblock :text "1" :startpos 9 :endpos 9) (tb/textblock :text "," :startpos 10 :endpos 10 :delim (copy tb/delimcomma :pos 0)) (tb/textblock :text `"2"` :startpos 11 :endpos 13 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "2" :startpos 12 :endpos 12))))) (textblock-csv<-string `"a","b" 1,"2"`))
Source Code:
  • (func textblock-csv<-string : textblock [text : string] (tb/textblock-parse<-string-delim text delimcsv) :test (test (tb/textblock :text `"a","b" 1,"2"` :startpos 1 :endpos 13 :children (tb/textblocklist (tb/textblock :text `"a"` :startpos 1 :endpos 3 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "a" :startpos 2 :endpos 2))) (tb/textblock :text "," :startpos 4 :endpos 4 :delim (copy tb/delimcomma :pos 0)) (tb/textblock :text `"b"` :startpos 5 :endpos 7 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "b" :startpos 6 :endpos 6))) (tb/textblock :text "\n" :startpos 8 :endpos 8 :delim (copy tb/delimline :pos 0)) (tb/textblock :text "1" :startpos 9 :endpos 9) (tb/textblock :text "," :startpos 10 :endpos 10 :delim (copy tb/delimcomma :pos 0)) (tb/textblock :text `"2"` :startpos 11 :endpos 13 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "2" :startpos 12 :endpos 12))))) (textblock-csv<-string `"a","b" 1,"2"`)) :doc "Returns a parsed csv-textblock from a string.")
vx/data/db
Description:
  • Database handler
Package Name:
  • vx/data/db
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
Types:
  • db, dbcell, dbcellmap, dbfield, dbfieldmap, dbid, dblink, dblinklist, dbnode, dbnote, dbtable, dbvalue
Constants:
Functions:
Source Code:
  • (package vx/data/db :doc "Database handler") (type db : struct :properties [dbid : string] :doc "Database trait") (type dbcell : struct :properties [dbcellid : string dbcellmap : dbcellmap dbfieldmap : dbfieldmap dbparent : dbcell dbtable : dbtable] :doc "Database Cell trait") (type dbcellmap : map :allowtypes [dbcell] :doc "Database Cell Map") (type dbfield : struct :properties [dbfieldid : string type : any value : any] :doc "Database Field trait") (type dbfieldmap : map :allowtypes [dbfield] :doc "Database Field Map") (type dbid : string :doc "Database id") (type dblink : struct :properties [fromid : dbid toid : dbid] :doc "Database link") (type dblinklist : list :allowtypes [dblink] :doc "Database link") (type dbnode : struct :properties [dbid : dbid links : dblinklist] :doc "Database node") (type dbnote : struct :properties [dbid : dbid valid : dbid noteid : dbid valueid : dbid value : string] :doc "Database Value") (type dbtable : struct :properties [dbtableid : string db : db dbcellmap : dbcellmap dbfieldmap : dbfieldmap] :doc "Database Table trait") (type dbvalue : struct :properties [dbid : dbid fromid : dbid toid : dbid noteid : dbid valid : dbid valtext : string] :doc "Database Value")
vx/data/db / db
Description:
  • Database trait
Type Name:
  • db
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    dbid
    vx/core/string
    false
    false
Usage/Test Cases:
Source Code:
  • (type db : struct :properties [dbid : string] :doc "Database trait")
vx/data/db / dbcell
Description:
  • Database Cell trait
Type Name:
  • dbcell
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    dbcellid
    vx/core/string
    false
    false
    dbcellmap
    vx/data/db/dbcellmap
    false
    false
    dbfieldmap
    vx/data/db/dbfieldmap
    false
    false
    dbparent
    vx/data/db/dbcell
    false
    false
    dbtable
    vx/data/db/dbtable
    false
    false
Usage/Test Cases:
Source Code:
  • (type dbcell : struct :properties [dbcellid : string dbcellmap : dbcellmap dbfieldmap : dbfieldmap dbparent : dbcell dbtable : dbtable] :doc "Database Cell trait")
vx/data/db / dbcellmap
Description:
  • Database Cell Map
Type Name:
  • dbcellmap
Extends:
  • :map
Default:
Allowed Types:
  • dbcell
Usage/Test Cases:
Source Code:
  • (type dbcellmap : map :allowtypes [dbcell] :doc "Database Cell Map")
vx/data/db / dbfield
Description:
  • Database Field trait
Type Name:
  • dbfield
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    dbfieldid
    vx/core/string
    false
    false
    type
    vx/core/any
    false
    false
    value
    vx/core/any
    false
    false
Usage/Test Cases:
Source Code:
  • (type dbfield : struct :properties [dbfieldid : string type : any value : any] :doc "Database Field trait")
vx/data/db / dbfieldmap
Description:
  • Database Field Map
Type Name:
  • dbfieldmap
Extends:
  • :map
Default:
Allowed Types:
  • dbfield
Usage/Test Cases:
Source Code:
  • (type dbfieldmap : map :allowtypes [dbfield] :doc "Database Field Map")
vx/data/db / dbid
Description:
  • Database id
Type Name:
  • dbid
Extends:
  • :string
Default:
Usage/Test Cases:
Source Code:
  • (type dbid : string :doc "Database id")
vx/data/db / dbnode
Description:
  • Database node
Type Name:
  • dbnode
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    dbid
    vx/data/db/dbid
    false
    false
    links
    vx/data/db/dblinklist
    false
    false
Usage/Test Cases:
Source Code:
  • (type dbnode : struct :properties [dbid : dbid links : dblinklist] :doc "Database node")
vx/data/db / dbnote
Description:
  • Database Value
Type Name:
  • dbnote
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    dbid
    vx/data/db/dbid
    false
    false
    valid
    vx/data/db/dbid
    false
    false
    noteid
    vx/data/db/dbid
    false
    false
    valueid
    vx/data/db/dbid
    false
    false
    value
    vx/core/string
    false
    false
Usage/Test Cases:
Source Code:
  • (type dbnote : struct :properties [dbid : dbid valid : dbid noteid : dbid valueid : dbid value : string] :doc "Database Value")
vx/data/db / dbtable
Description:
  • Database Table trait
Type Name:
  • dbtable
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    dbtableid
    vx/core/string
    false
    false
    db
    vx/data/db/db
    false
    false
    dbcellmap
    vx/data/db/dbcellmap
    false
    false
    dbfieldmap
    vx/data/db/dbfieldmap
    false
    false
Usage/Test Cases:
Source Code:
  • (type dbtable : struct :properties [dbtableid : string db : db dbcellmap : dbcellmap dbfieldmap : dbfieldmap] :doc "Database Table trait")
vx/data/db / dbvalue
Description:
  • Database Value
Type Name:
  • dbvalue
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    dbid
    vx/data/db/dbid
    false
    false
    fromid
    vx/data/db/dbid
    false
    false
    toid
    vx/data/db/dbid
    false
    false
    noteid
    vx/data/db/dbid
    false
    false
    valid
    vx/data/db/dbid
    false
    false
    valtext
    vx/core/string
    false
    false
Usage/Test Cases:
Source Code:
  • (type dbvalue : struct :properties [dbid : dbid fromid : dbid toid : dbid noteid : dbid valid : dbid valtext : string] :doc "Database Value")
vx/data/file
Description:
  • File handler
Package Name:
  • vx/data/file
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    tb
    vx/data/textblock
    javaniofile
    java.nio.file.*
Types:
  • file, fileformat
Constants:
Functions:
  • boolean-exists<-file, boolean-write<-file-any, boolean-write<-file, boolean-write<-file-string, file-read<-file, string-read<-file, name<-file, path<-file, pathcurrent<-os, pathfull<-file
Source Code:
  • (package vx/data/file :libs (lib tb :path vx/data/textblock) (lib javaniofile) :doc "File handler") (type file : struct :properties [name : string format : fileformat path : string permission : permission text : string] :doc "File structure") (type fileformat : string :allowvalues [:text]) (func boolean-exists<-file : boolean [file : file] (native :cpp "output = vx_data_file::vx_boolean_exists_from_file(file);" :java "Core.Type_string fullpath = File.f_pathfull_from_file(file); String sfullpath = fullpath.vx_string(); Path path = Paths.get(sfullpath); if (Files.exists(path)) { output = Core.c_true; }") :test (test-true (boolean-exists<-file (file :name "boolean_exists_from_file.txt" :path "src/test/resources/vx"))) :clientserver :server :doc "Returns true if file/path exists.") (func boolean-write<-file-any : boolean [file : file val : any] (boolean-write<-file-string file (string<-any val)) :context :sideeffects "Writes to file io" :clientserver :server :doc "Write any data structure as a file.") (func boolean-write<-file : boolean [file : file] (boolean-write<-file-string file (:text file)) :context :sideeffects "Writes to file io" :clientserver :server :doc "Write a File to Disk") (func boolean-write<-file-string : boolean [file : file text : string] (native :cpp "output = vx_data_file::vx_boolean_write_from_file_string(file, text);" :java "Core.Type_string fullpath = File.f_pathfull_from_file(file); String sfullpath = fullpath.vx_string(); Path path = Paths.get(sfullpath); String stext = text.vx_string(); byte[] bytes = stext.getBytes(); java.nio.file.Files.write(path, bytes); output = Core.c_true;") :context :messages :permission :sideeffects "Writes to file io" :test (test-true (boolean-write<-file-string (file :name "boolean_write_from_file_string.txt" :path "src/test/resources/vx") "writetext")) :clientserver :server :doc "Write a File to Disk") (func file-read<-file : file [file : file] (copy file :text (string-read<-file file)) :context :permission :test (test (file :name "string_read_from_file.txt" :path "src/test/resources/vx" :text "testdata") (file-read<-file (file :name "string_read_from_file.txt" :path "src/test/resources/vx"))) :clientserver :server :doc "Read a Text File from Disk") (func string-read<-file : string [file : file] (native :cpp "output = vx_data_file::vx_string_read_from_file(file);" :java "output = vx_string_read_from_file(file);") :context :permission :messages :test (test "testdata" (string-read<-file (file :name "string_read_from_file.txt" :path "src/test/resources/vx"))) :clientserver :server :doc "Read text from a File") (func name<-file : string [file : file] (:name file) :doc "Returns path and name from file.") (func path<-file : string [file : file] (:path file) :doc "Returns path and name from file.") (func pathcurrent<-os : string (native :cpp "output = vx_data_file::vx_pathcurrent_from_os();" :java "Path path = Paths.get(“”); path = path.toAbsolutePath(); String spath = path.toString(); output = Core.vx_new_string(spath);") :clientserver :server :doc "Returns current system path.") (func pathfull<-file : string [file : file] (let : string [path : string := (path<-file file) name : string := (name<-file file)] (string path "/" name)) :doc "Returns full path and name from file.")
vx/data/file / file
Description:
  • File structure
Type Name:
  • file
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    name
    vx/core/string
    false
    false
    format
    vx/data/file/fileformat
    false
    false
    path
    vx/core/string
    false
    false
    permission
    vx/core/permission
    false
    false
    text
    vx/core/string
    false
    false
Usage/Test Cases:
Source Code:
  • (type file : struct :properties [name : string format : fileformat path : string permission : permission text : string] :doc "File structure")
vx/data/file / fileformat
Description:
Type Name:
  • fileformat
Extends:
  • :string
Default:
Usage/Test Cases:
Source Code:
  • (type fileformat : string :allowvalues [:text])
vx/data/file / boolean-exists<-file
Description:
  • Returns true if file/path exists.
Function Name:
  • boolean-exists<-file
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    file
    vx/data/file/file
Usage/Test Cases:
  • (test-true (boolean-exists<-file (file :name "boolean_exists_from_file.txt" :path "src/test/resources/vx")))
Source Code:
  • (func boolean-exists<-file : boolean [file : file] (native :cpp "output = vx_data_file::vx_boolean_exists_from_file(file);" :java "Core.Type_string fullpath = File.f_pathfull_from_file(file); String sfullpath = fullpath.vx_string(); Path path = Paths.get(sfullpath); if (Files.exists(path)) { output = Core.c_true; }") :test (test-true (boolean-exists<-file (file :name "boolean_exists_from_file.txt" :path "src/test/resources/vx"))) :clientserver :server :doc "Returns true if file/path exists.")
vx/data/file / boolean-write<-file-any
Description:
  • Write any data structure as a file.
Function Name:
  • boolean-write<-file-any
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    file
    vx/data/file/file
    val
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func boolean-write<-file-any : boolean [file : file val : any] (boolean-write<-file-string file (string<-any val)) :context :sideeffects "Writes to file io" :clientserver :server :doc "Write any data structure as a file.")
vx/data/file / boolean-write<-file
Description:
  • Write a File to Disk
Function Name:
  • boolean-write<-file
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    file
    vx/data/file/file
Usage/Test Cases:
Source Code:
  • (func boolean-write<-file : boolean [file : file] (boolean-write<-file-string file (:text file)) :context :sideeffects "Writes to file io" :clientserver :server :doc "Write a File to Disk")
vx/data/file / boolean-write<-file-string
Description:
  • Write a File to Disk
Function Name:
  • boolean-write<-file-string
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    file
    vx/data/file/file
    text
    vx/core/string
Usage/Test Cases:
  • (test-true (boolean-write<-file-string (file :name "boolean_write_from_file_string.txt" :path "src/test/resources/vx") "writetext"))
Source Code:
  • (func boolean-write<-file-string : boolean [file : file text : string] (native :cpp "output = vx_data_file::vx_boolean_write_from_file_string(file, text);" :java "Core.Type_string fullpath = File.f_pathfull_from_file(file); String sfullpath = fullpath.vx_string(); Path path = Paths.get(sfullpath); String stext = text.vx_string(); byte[] bytes = stext.getBytes(); java.nio.file.Files.write(path, bytes); output = Core.c_true;") :context :messages :permission :sideeffects "Writes to file io" :test (test-true (boolean-write<-file-string (file :name "boolean_write_from_file_string.txt" :path "src/test/resources/vx") "writetext")) :clientserver :server :doc "Write a File to Disk")
vx/data/file / file-read<-file
Description:
  • Read a Text File from Disk
Function Name:
  • file-read<-file
Return Type:
  • vx/data/file/file
Arguments:
  • Name
    Type
    Generic
    Description
    file
    vx/data/file/file
Usage/Test Cases:
  • (test (file :name "string_read_from_file.txt" :path "src/test/resources/vx" :text "testdata") (file-read<-file (file :name "string_read_from_file.txt" :path "src/test/resources/vx")))
Source Code:
  • (func file-read<-file : file [file : file] (copy file :text (string-read<-file file)) :context :permission :test (test (file :name "string_read_from_file.txt" :path "src/test/resources/vx" :text "testdata") (file-read<-file (file :name "string_read_from_file.txt" :path "src/test/resources/vx"))) :clientserver :server :doc "Read a Text File from Disk")
vx/data/file / string-read<-file
Description:
  • Read text from a File
Function Name:
  • string-read<-file
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    file
    vx/data/file/file
Usage/Test Cases:
  • (test "testdata" (string-read<-file (file :name "string_read_from_file.txt" :path "src/test/resources/vx")))
Source Code:
  • (func string-read<-file : string [file : file] (native :cpp "output = vx_data_file::vx_string_read_from_file(file);" :java "output = vx_string_read_from_file(file);") :context :permission :messages :test (test "testdata" (string-read<-file (file :name "string_read_from_file.txt" :path "src/test/resources/vx"))) :clientserver :server :doc "Read text from a File")
vx/data/file / name<-file
Description:
  • Returns path and name from file.
Function Name:
  • name<-file
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    file
    vx/data/file/file
Usage/Test Cases:
Source Code:
  • (func name<-file : string [file : file] (:name file) :doc "Returns path and name from file.")
vx/data/file / path<-file
Description:
  • Returns path and name from file.
Function Name:
  • path<-file
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    file
    vx/data/file/file
Usage/Test Cases:
Source Code:
  • (func path<-file : string [file : file] (:path file) :doc "Returns path and name from file.")
vx/data/file / pathcurrent<-os
Description:
  • Returns current system path.
Function Name:
  • pathcurrent<-os
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func pathcurrent<-os : string (native :cpp "output = vx_data_file::vx_pathcurrent_from_os();" :java "Path path = Paths.get(“”); path = path.toAbsolutePath(); String spath = path.toString(); output = Core.vx_new_string(spath);") :clientserver :server :doc "Returns current system path.")
vx/data/file / pathfull<-file
Description:
  • Returns full path and name from file.
Function Name:
  • pathfull<-file
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    file
    vx/data/file/file
Usage/Test Cases:
Source Code:
  • (func pathfull<-file : string [file : file] (let : string [path : string := (path<-file file) name : string := (name<-file file)] (string path "/" name)) :doc "Returns full path and name from file.")
vx/data/table
Description:
  • General data table
Package Name:
  • vx/data/table
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
Types:
  • cell, celllist, cellmap, field, fieldlist, fieldmap, filter, row, rowlist, rowmap, sort, table
Constants:
Functions:
Source Code:
  • (package vx/data/table :doc "General data table") (type cell : struct :properties [id : string value : any]) (type celllist : list :allowtypes [cell]) (type cellmap : map :allowtypes [cell]) (type field : struct :properties [id : string name : string fldtype : any]) (type fieldlist : list :allowtypes [field]) (type fieldmap : list :allowtypes [field]) (type filter : struct :properties [id : string name : string idlist : stringlist]) (type row : struct :properties [id : string cellmap : cellmap cellsort : sort]) (type rowlist : list :allowtypes [row]) (type rowmap : map :allowtypes [row]) (type sort : struct :properties [id : string name : string idlist : stringlist]) (type table : struct :properties [id : string name : string fieldmap : fieldmap fieldsort : sort rowmap : rowmap rowfilter : filter rowsort : sort])
vx/data/table / cell
Description:
Type Name:
  • cell
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    id
    vx/core/string
    false
    false
    value
    vx/core/any
    false
    false
Usage/Test Cases:
Source Code:
  • (type cell : struct :properties [id : string value : any])
vx/data/table / celllist
Description:
Type Name:
  • celllist
Extends:
  • :list
Default:
Allowed Types:
  • cell
Usage/Test Cases:
Source Code:
  • (type celllist : list :allowtypes [cell])
vx/data/table / cellmap
Description:
Type Name:
  • cellmap
Extends:
  • :map
Default:
Allowed Types:
  • cell
Usage/Test Cases:
Source Code:
  • (type cellmap : map :allowtypes [cell])
vx/data/table / field
Description:
Type Name:
  • field
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    id
    vx/core/string
    false
    false
    name
    vx/core/string
    false
    false
    fldtype
    vx/core/any
    false
    false
Usage/Test Cases:
Source Code:
  • (type field : struct :properties [id : string name : string fldtype : any])
vx/data/table / fieldlist
Description:
Type Name:
  • fieldlist
Extends:
  • :list
Default:
Allowed Types:
  • field
Usage/Test Cases:
Source Code:
  • (type fieldlist : list :allowtypes [field])
vx/data/table / fieldmap
Description:
Type Name:
  • fieldmap
Extends:
  • :list
Default:
Allowed Types:
  • field
Usage/Test Cases:
Source Code:
  • (type fieldmap : list :allowtypes [field])
vx/data/table / filter
Description:
Type Name:
  • filter
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    id
    vx/core/string
    false
    false
    name
    vx/core/string
    false
    false
    idlist
    vx/core/stringlist
    false
    false
Usage/Test Cases:
Source Code:
  • (type filter : struct :properties [id : string name : string idlist : stringlist])
vx/data/table / row
Description:
Type Name:
  • row
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    id
    vx/core/string
    false
    false
    cellmap
    vx/data/table/cellmap
    false
    false
    cellsort
    vx/data/table/sort
    false
    false
Usage/Test Cases:
Source Code:
  • (type row : struct :properties [id : string cellmap : cellmap cellsort : sort])
vx/data/table / rowlist
Description:
Type Name:
  • rowlist
Extends:
  • :list
Default:
Allowed Types:
  • row
Usage/Test Cases:
Source Code:
  • (type rowlist : list :allowtypes [row])
vx/data/table / rowmap
Description:
Type Name:
  • rowmap
Extends:
  • :map
Default:
Allowed Types:
  • row
Usage/Test Cases:
Source Code:
  • (type rowmap : map :allowtypes [row])
vx/data/table / sort
Description:
Type Name:
  • sort
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    id
    vx/core/string
    false
    false
    name
    vx/core/string
    false
    false
    idlist
    vx/core/stringlist
    false
    false
Usage/Test Cases:
Source Code:
  • (type sort : struct :properties [id : string name : string idlist : stringlist])
vx/data/table / table
Description:
Type Name:
  • table
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    id
    vx/core/string
    false
    false
    name
    vx/core/string
    false
    false
    fieldmap
    vx/data/table/fieldmap
    false
    false
    fieldsort
    vx/data/table/sort
    false
    false
    rowmap
    vx/data/table/rowmap
    false
    false
    rowfilter
    vx/data/table/filter
    false
    false
    rowsort
    vx/data/table/sort
    false
    false
Usage/Test Cases:
Source Code:
  • (type table : struct :properties [id : string name : string fieldmap : fieldmap fieldsort : sort rowmap : rowmap rowfilter : filter rowsort : sort])
vx/data/textblock
Description:
  • Text parser
Package Name:
  • vx/data/textblock
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    collection
    vx/collection
    type
    vx/type
Types:
  • delim, delimlist, textblock, textblocklist
Constants:
  • delimbracketangle, delimbracketcurly, delimbracketsquare, delimclose, delimclosing, delimcomma, delimcomment, delimcommentblock, delimline, delimnonwhitespace, delimparen, delimquote, delimquoteblock, delimspace, delimtest1, delimlisttest1, delimtest2, delimlisttest2, delimtest3, delimlisttest3, delimtext, delimwhitespace
Functions:
  • children<-textblock, delim-first<-delim-delim, delim-first<-string-delimlist, delim-pos<-string-delim, delimlist-pos<-string-delimlist, is-close, is-single, stringlist<-textblocklist, text<-textblock, textblock<-close-textblock, textblock<-empty-textblock, textblock<-open-textblock, textblock<-single-textblock, textblock<-string-delim, textblock<-textblock-delim, textblock-addchild<-textblock-find-child, textblock-delimnotfound, textblock-findparent<-textblock, textblock-init, textblock-parse, textblock-parse<-string-delim, textblock-parse-one, textblock-replace<-textblock-find-replace, textblock-startleft<-string-delim-offset, textblock-startright<-string-delim-offset, textblocklist<-textblocklist-remove
Source Code:
  • (package vx/data/textblock :libs (lib collection :path vx/collection) (lib type :path vx/type) :doc "Text parser") (type delim : struct :properties [name : string starttext : string endtext : string pos : int delimlist : delimlist] :doc "A delimiter type supporting start and end delimiters and positions.") (type delimlist : list :allowtypes [delim] :test (test (new delimlist delimcomma delimwhitespace) (delimlist delimcomma delimwhitespace)) :doc "A list of delim.") (type textblock : struct :properties [name : string text : string startpos : int endpos : int curpos : int line : int column : int delim : delim close : delim parent : textblock children : textblocklist] :doc "A textblock is a tree of text used for parsing by delimter.") (type textblocklist : list :allowtypes [textblock] :doc "A list of textblock.") (const delimbracketangle : delim (delim :name "delimbracketangle" :starttext "<" :endtext ">") :doc "Angle Bracket Delimiter") (const delimbracketcurly : delim (delim :name "delimbracketcurly" :starttext "{" :endtext "}") :doc "Curly Bracket Delimiter") (const delimbracketsquare : delim (delim :name "delimbracketsquare" :starttext "[" :endtext "]") :doc "Square Bracket Delimiter") (const delimclose : delim (delim :name "delimclose") :doc "A placeholder delimiter used to mark the close of whatever is the current delimiter.") (const delimclosing : delim (delim :name "delimclosing") :doc "A placeholder delimiter used to mark the closing of whatever is the current delimiter.") (const delimcomma : delim (delim :name "delimcomma" :starttext ",") :doc "Comma Delimiter") (const delimcomment : delim (delim :name "delimcomment" :starttext "//" :endtext "\n") :doc "Comment Delimiter") (const delimcommentblock : delim (delim :name "delimcommentblock" :starttext "/*" :endtext "*/") :doc "Block Comment Delimiter") (const delimline : delim (delim :name "delimline" :starttext "\n") :doc "New Line Delimiter") (const delimnonwhitespace : delim (delim :name "delimnonwhitespace" :starttext ":nonwhitespace" :endtext ":whitespace") :doc "Placeholder for delimited non-whitespace") (const delimparen : delim (delim :name "delimparen" :starttext "(" :endtext ")") :doc "Parenthesis Delimiter") (const delimquote : delim (delim :name "delimquote" :starttext quote :endtext quote) :doc "Quote Delimiter") (const delimquoteblock : delim (delim :name "delimquoteblock" :starttext "`" :endtext "`") :doc "Block Quote Delimiter") (const delimspace : delim (delim :name "delimspace" :starttext " " :endtext " ") :doc "Space Delimiter") (const delimtest1 : delim (delim :delimlist delimlisttest1) :doc "A delimiter used for test suite") (const delimlisttest1 : delimlist (delimlist delimtest2) :doc "A delimiter used for test suite") (const delimtest2 : delim (copy delimbracketangle :delimlist delimlisttest2) :doc "A delimiter used for test suite") (const delimlisttest2 : delimlist (delimlist delimcomma delimtest3) :doc "A delimiter used for test suite") (const delimtest3 : delim (copy delimbracketcurly :delimlist delimlisttest3) :doc "A delimiter used for test suite") (const delimlisttest3 : delimlist (delimlist delimcomma delimwhitespace) :doc "A delimiter used for test suite") (const delimtext : delim (delim :name "delimtext") :doc "Placeholder for delimited text") (const delimwhitespace : delim (delim :name "delimwhitespace" :starttext ":whitespace") :doc "Placeholder for delimited whitespace") (func children<-textblock : textblocklist [textblock : textblock] (:children textblock) :doc "Returns the child textblocks from a given textblock.") (func delim-first<-delim-delim : delim [delim1 : delim delim2 : delim] (let : delim [pos1 : int := (:pos delim1) pos2 : int := (:pos delim2)] (if : delim (then (= 0 pos2) delim1) (then (= 0 pos1) delim2) (then (is-empty delim2) delim1) (then (is-empty delim1) delim2) (then (< pos2 pos1) delim2) (else delim1))) :test (test (copy delimcomma :pos 1) (delim-first<-delim-delim (copy delimspace :pos 2) (copy delimcomma :pos 1))) (test (empty delim) (delim-first<-delim-delim (delim :pos 0) (empty delim))) :doc "Returns non-empty delim with lowest, non-negative startpos found in string.") (func delim-first<-string-delimlist : delim [text : string delimlist : delimlist] (if : delim (then (is-empty delimlist) (empty delim)) (else (let : delim [resolvedlist : delimlist := (delimlist-pos<-string-delimlist text delimlist)] (any<-list-start-reduce : delim resolvedlist (empty delim) delim-first<-delim-delim)))) :test (test (copy delimcomma :pos 2) (delim-first<-string-delimlist "a, b" (delimlist delimspace delimcomma))) :doc "Returns delim with lowest startpos found in string.") (func delim-pos<-string-delim : delim [text : string delim : delim] (let : delim [find : string := (:starttext delim) pos : int := (typ/int<-string-findkeyword text find)] (if : delim (then (= pos 0) delim) (else (copy delim :pos pos)))) :test (test (copy delimcomma :pos 2) (delim-pos<-string-delim "a,b" delimcomma)) :doc "Return a delim with istart updated to position of first starttext.") (func delimlist-pos<-string-delimlist : delimlist [text : string delimlist : delimlist] (list<-list : delimlist delimlist (fn : delim [delim : delim] (delim-pos<-string-delim text delim))) :test (test (delimlist (copy delimspace :pos 3) (copy delimcomma :pos 2)) (delimlist-pos<-string-delimlist "a, b" (delimlist delimspace delimcomma))) :doc "Returns a delimlist with each delim updated to position of first starttext.") (func is-close : boolean [delimarg : delim] (= (:name delimarg) (:name delimclose)) :doc "Return true if the given delim is a close delim.") (func is-single : boolean [delimarg : delim] (and (!= "" (:starttext delimarg)) (= "" (:endtext delimarg))) :doc "Return true if the given delim is a single text delim.") (func stringlist<-textblocklist : stringlist [textblocklist : textblocklist] (list<-list : stringlist textblocklist text<-textblock) :test (test (stringlist "a" "b") (stringlist<-textblocklist (textblocklist (textblock :text "a") (textblock :text "b")))) :doc "Returns a stringlist from each (:text textblock).") (func text<-textblock : string [block : textblock] (:text block) :test (test "a" (text<-textblock (textblock :text "a"))) :doc "Returns the text from a given textblock.") (func textblock<-close-textblock : textblock [close : delim textblockarg : textblock] (let : textblock [text : string := (:text textblockarg) parent : textblock := (:parent textblockarg) startpos : int := (:startpos textblockarg) endpos : int := (:endpos textblockarg) pos : int := (:pos close) textclose : string := (:starttext close) lenclose : int := (length<-string textclose) posminus : int := (-1 pos) startleft : int := startpos startclose : int := (+ startpos posminus) endclose : int := (switch : int textclose (case :whitespace (int<-string-findkeyword text :nonwhitespace)) (else (+ (-1 startclose) lenclose))) endleft : int := (if : int (= 1 pos) startclose (-1 startclose)) startright : int := (+1 endclose) endright : int := (if : int (< endpos startright) startright endpos) textleft : string := (typ/string<-string-end text posminus) textright : string := (typ/string<-string-start text (+ pos lenclose)) find : textblock := (textblock-findparent<-textblock parent) closefind : delim := (:close find) textfind : string := (:text find) startfind : int := (:startpos find) delimfind : delim := (:delim find) delimright : delim := (delim :delimlist (:delimlist delimfind)) lenfind : int := (- (+1 endclose) startfind) textreplace : string := (string<-string-end textfind lenfind) replace : textblock := (copy find :text textreplace :endpos endclose :delim (copy delimfind :delimlist (empty delimlist)) :close delimclosing) parentchg : textblock := (textblock-replace<-textblock-find-replace parent find replace)] (textblock :text textleft :startpos startleft :endpos endleft :parent (copy textblockarg :text textright :startpos startright :endpos endright :delim delimright :close closefind :parent parentchg))) :test (test (textblock :text "b" :startpos 5 :endpos 5 :parent (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)))))) (textblock<-close-textblock (copy delimclose :starttext "}" :pos 2) (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0))))))) (test (textblock :startpos 13 :endpos 13 :parent (textblock :startpos 14 :endpos 14 :delim (delim :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))) (textblock<-close-textblock (copy delimclose :starttext ">" :pos 1) (textblock :text ">" :startpos 13 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11)))))))) :doc "Returns a textblock after a close delim found.") (func textblock<-empty-textblock : textblock [empty : delim textblockarg : textblock] :doc "Returns a textblock after an empty delim found.") (func textblock<-open-textblock : textblock [open : delim textblockarg : textblock] (let : textblock [text : string := (:text textblockarg) parent : textblock := (:parent textblockarg) startpos : int := (:startpos textblockarg) endpos : int := (:endpos textblockarg) delima : delim := (:delim textblockarg) pos : int := (:pos open) textopen : string := (:starttext open) textclose : string := (:endtext open) delimlistl : delimlist := (:delimlist open) lenopen : int := (length<-string textopen) posminus : int := (-1 pos) startleft : int := (if : int (= pos 1) (-1 startpos) startpos) endleft : int := (if : int (= pos 1) (-1 startpos) (+ (-1 startleft) posminus)) startright : int := (+ startpos posminus lenopen) startopen : int := (+ startpos posminus) textleft : string := (typ/string<-string-end text posminus) textpar : string := (typ/string<-string-start text pos) textright : string := (typ/string<-string-start text (+ pos lenopen)) close : delim := (copy delimclose :starttext textclose) tbleft : textblock := (if : textblock (then (= "" textleft) (empty textblock)) (else (textblock :text textleft :startpos startleft :endpos endleft))) tbpar1 : textblock := (copy textblockarg :text textpar :startpos startopen :delim (copy open :pos 0 :delimlist (:delimlist delima)) :parent parent) tbfind : textblock := (if : textblock (then (= "" textleft) (empty textblock)) (else (textblock-findparent<-textblock parent))) tbparent : textblock := (if : textblock (then (is-empty tbfind) tbpar1) (else (textblock-addchild<-textblock-find-child tbpar1 tbfind tbleft)))] (textblock :text textright :startpos startright :endpos endpos :delim (delim :delimlist delimlistl) :close close :parent tbparent)) :test (test (textblock :text "c}" :startpos 4 :endpos 5 :close (copy delimclose :starttext "}") :parent (textblock :text "{c}" :startpos 3 :endpos 5 :delim (copy delimbracketcurly :pos 0) :parent (textblock :text "ab{c}" :startpos 1 :endpos 5 :children (textblocklist (textblock :text "ab" :startpos 1 :endpos 2))))) (textblock<-open-textblock (copy delimbracketcurly :pos 3) (textblock :text "ab{c}" :startpos 1 :endpos 5 :delim delimbracketcurly :parent (textblock :text "ab{c}" :startpos 1 :endpos 5)))) (test (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13))) (textblock<-open-textblock (copy delimtest2 :pos 1) (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim delimtest1 :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))) (test (textblock :text "a,b},{c d}>" :startpos 3 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))) (textblock<-open-textblock (copy delimtest3 :pos 1) (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13))))) :doc "Returns a textblock after a close delim found.") (func textblock<-single-textblock : textblock [single : delim textblockarg : textblock] (let : textblock [text : string := (:text textblockarg) parent : textblock := (:parent textblockarg) startpos : int := (:startpos textblockarg) endpos : int := (:endpos textblockarg) pos : int := (:pos single) origsingle : string := (:starttext single) textsingle : string := (switch : string origsingle (case :whitespace (let : string [text2 : string := (typ/string<-string-start text pos) pos2 : int := (typ/int<-string-findkeyword text2 :nonwhitespace) pos3 : int := (if : int (then (= 0 pos2) (length<-string text2)) (then (= pos2 pos) pos2) (else (-1 pos2)))] (typ/string<-string-start-end text pos pos3))) (else origsingle)) delimlistl : delimlist := (:delimlist single) lensingle : int := (length<-string textsingle) posminus : int := (-1 pos) startleft : int := startpos startsingle : int := (+ startpos posminus) endsingle : int := (switch : int textsingle (case :whitespace (int<-string-findkeyword text :nonwhitespace)) (else (+ (-1 startsingle) lensingle))) endleft : int := (if : int (= startsingle startpos) startsingle (-1 startsingle)) startright : int := (+1 endsingle) textleft : string := (typ/string<-string-end text posminus) textpar : string := (typ/string<-string-start text pos) textright : string := (typ/string<-string-start text (+ pos lensingle))] (textblock :text textleft :startpos startleft :endpos endleft :delim (delim :delimlist delimlistl) :parent (textblock :text textsingle :startpos startsingle :endpos endsingle :delim (copy single :pos 0 :delimlist (empty delimlist)) :parent (copy textblockarg :text textright :startpos startright :endpos endpos)))) :test (test (textblock :text "a" :startpos 3 :endpos 3 :parent (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0) :parent (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :pos 0) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))))) (textblock<-single-textblock (copy delimcomma :pos 2) (textblock :text "a,b},{c d}>" :startpos 3 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :pos 0) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))))) (test (textblock :startpos 7 :endpos 7 :parent (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0) :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5)))))))) (textblock<-single-textblock (copy delimcomma :pos 1) (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5)))))))) (test (textblock :text "c" :startpos 9 :endpos 9 :parent (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0) :parent (textblock :text "d}>" :startpos 11 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))))))) (textblock<-single-textblock (copy delimwhitespace :pos 2) (textblock :text "c d}>" :startpos 9 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))))))) :doc "Returns a textblock after a single value delim found.") (func textblock<-string-delim : textblock [text : string delim : delim] (textblock :text text :delim delim :startpos 0 :endpos (length<-string text)) :test (test (textblock :text "a" :startpos 0 :endpos 1 :delim delimcomma) (textblock<-string-delim "a" delimcomma)) :doc "Returns a textblock from a string and delim.") (func textblock<-textblock-delim : textblock [textblock : textblock delim : delim] :doc "Returns a parsed textblock from an unparsed one.") (func textblock-addchild<-textblock-find-child : textblock [textblockarg : textblock find : textblock child : textblock] (if : textblock (then // empty (is-empty textblockarg) (empty textblock)) (then // found (and (== find textblockarg)) (copy textblockarg :children (copy (:children textblockarg) child))) (else // recursion (copy textblockarg :parent (textblock-addchild<-textblock-find-child (:parent textblockarg) find child)))) :doc "Add the child to the given parent textblock.") (func textblock-delimnotfound : textblock [textblockarg : textblock] (let : textblock [text : string := (:text textblockarg) delima : delim := (:delim textblockarg) close : delim := (:close textblockarg) parent : textblock := (:parent textblockarg) childp : textblocklist := (:children parent) delimp : delim := (:delim parent) delims : delimlist := (:delimlist delimp)] (if : textblock (then // if delim not closed then error (! (is-empty close)) (let : textblock [msgerr : msg := (msg<-error "closedelimmissing" close) child : textblock := (copy textblockarg :delim (empty delim) :close (empty delim) :parent (empty textblock)) find : textblock := (textblock-findparent<-textblock parent) childrenf : textblocklist := (:children find) childrenr : textblocklist := (copy childrenf child) replace : textblock := (copy find msgerr :children childrenr) parent2 : textblock := (textblock-replace<-textblock-find-replace parent find replace) gparent : textblock := (:parent parent2) parent3 : textblock := (copy parent2 :parent (empty textblock)) childreng : textblocklist := (:children gparent) childrenc : textblocklist := (copy childreng parent3)] (copy gparent :children childrenc msgerr))) (then // if empty parent then textblockarg (is-empty parent) textblockarg) (else // else add textblockarg to parent and return parent (let : textblock [delimchg : delim := (if : delim (is-empty (:delimlist delima)) delima (copy delima :delimlist (empty delimlist))) child : textblock := (if : textblock (= "" text) (empty textblock) (copy textblockarg :delim delimchg :parent (empty textblock))) find : textblock := (textblock-findparent<-textblock parent) closef : delim := (:close find) closing : boolean := (if : boolean (== closef delimclosing) true)] (if : textblock (then closing (let : textblock [parent2 : textblock := (:parent find) find2 : textblock := (textblock-findparent<-textblock parent2) children1 : textblocklist := (if : textblocklist (is-empty child) (:children find) (copy (:children find) child)) replace1 : textblock := (copy find :close (empty delim) :parent (empty textblock) :children children1)] (if : textblock (then (is-empty find2) (copy parent :parent (copy parent2 :children (textblocklist replace1)))) (else (let : textblock [children2 : textblocklist := (copy (:children find2) replace1) replace2 : textblock := (copy find2 :close (empty delim) :children children2) replace : textblock := (textblock-replace<-textblock-find-replace parent2 find2 replace2)] (textblock-replace<-textblock-find-replace parent find replace)))))) (then (is-empty child) parent) (else (textblock-addchild<-textblock-find-child parent find child))))))) :test (test (textblock :text "<a" :startpos 1 :endpos 2 :children (textblocklist (textblock :text "<a" :startpos 1 :endpos 2 :delim (copy delimbracketangle :delimlist vx/data/textblock/delimlisttest1) :children (textblocklist (textblock :text "a" :startpos 2 :endpos 2)) (msgblock (msg :code "closedelimmissing" :detail (delim :name "delimclose" :starttext ">") :severity 2)))) (msgblock (msg :code "closedelimmissing" :detail (delim :name "delimclose" :starttext ">") :severity 2))) (textblock-delimnotfound (textblock :text "a" :startpos 2 :endpos 2 :delim (delim :delimlist vx/data/textblock/delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<a" :startpos 1 :endpos 2 :delim (copy delimbracketangle :delimlist vx/data/textblock/delimlisttest1) :parent (textblock :text "<a" :startpos 1 :endpos 2))))) (test (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0) :parent (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :pos 0) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3))))) (textblock-delimnotfound (textblock :text "a" :startpos 3 :endpos 3 :parent (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0) :parent (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :pos 0) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))))))) (test (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5)))))) (textblock-delimnotfound (textblock :text "b" :startpos 5 :endpos 5 :parent (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext ">") :parent (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)))))))) (test (textblock :startpos 14 :endpos 14 :delim (delim :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11)))))))) (textblock-delimnotfound (textblock :startpos 13 :endpos 13 :parent (textblock :startpos 14 :endpos 14 :delim (delim :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))))) (test (textblock :text "\"b\" 1,\"2\"" :startpos 5 :endpos 13 :delim (delim :delimlist (delimlist vx/data/textblock/delimline vx/data/textblock/delimquote vx/data/textblock/delimcomma)) :parent (textblock :text "\"a\",\"b\" 1,\"2\"" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "\"a\"" :startpos 1 :endpos 3 :delim (delim :name "delimquote" :starttext "\"" :endtext "\"") :children (textblocklist (textblock :text "a" :startpos 2 :endpos 2))) (textblock :text "," :startpos 4 :endpos 4 :delim (delim :name "delimcomma" :starttext ","))))) (textblock-delimnotfound (textblock :text "," :startpos 4 :endpos 4 :delim (delim :name "delimcomma" :starttext ",") :parent (textblock :text "\"b\" 1,\"2\"" :startpos 5 :endpos 13 :delim (delim :delimlist (delimlist vx/data/textblock/delimline vx/data/textblock/delimquote vx/data/textblock/delimcomma)) :parent (textblock :text "\"a\",\"b\" 1,\"2\"" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "\"a\"" :startpos 1 :endpos 3 :delim (delim :name "delimquote" :starttext "\"" :endtext "\"") :children (textblocklist (textblock :text "a" :startpos 2 :endpos 2))))))))) :doc "Returns a textblock when a delim is not found.") (func textblock-findparent<-textblock : textblock [textblockarg : textblock] (let : textblock [delimcurr : delim := (:delim textblockarg) parent : textblock := (:parent textblockarg) children : textblocklist := (:children textblockarg) starttext : string := (:starttext delimcurr) endtext : string := (:endtext delimcurr)] (if : textblock (then // empty (is-empty textblockarg) (empty textblock)) (then // allows children (or (is-empty parent) (and (!= "" starttext) (!= "" endtext))) textblockarg) (else // recursion (textblock-findparent<-textblock parent)))) :doc "Find a parent that accepts a child.") (func textblock-init : textblock [textblockarg : textblock] (let : textblock [text : string := (:text textblockarg) startpos : int := (if : int (= "" text) 0 1) endpos : int := (if : int (= "" text) 0 (length<-string text))] (copy textblockarg :startpos startpos :endpos endpos :parent (copy textblockarg :startpos startpos :endpos endpos :delim (empty delim)))) :test (test (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim delimtest1 :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) (textblock-init (textblock :text "<{a,b},{c d}>" :delim delimtest1))) :doc "Returns a textblock ready for parsing.") (func textblock-parse : textblock [textblock : textblock] (collection/any<-for-until-loop-max : textblock textblock (fn : boolean [current : textblock] (is-empty (:parent current))) (fn : textblock [current : textblock] (textblock-parse-one current)) 50000) :bigospace :n^n :bigotime :n^n :test (test (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))) (textblock-parse (textblock :text "<{a,b},{c d}>" :delim delimtest1))) :doc "Returns a fully parsed textblock from an initialized textblock.") (func textblock-parse<-string-delim : textblock [text : string delim : delim] (let : textblock [textblockinit : textblock := (textblock<-string-delim text delim)] (textblock-parse textblockinit)) :doc "Returns a fully parsed textblock from a string and delim.") (func textblock-parse-one : textblock [textblockarg : textblock] (let : textblock [delimarg : delim := (:delim textblockarg) close : delim := (:close textblockarg) startpos : int := (:startpos textblockarg) textarg : string := (:text textblockarg) parent : textblock := (:parent textblockarg) is-init : boolean := (and (is-empty parent) (= startpos 0)) starttext : string := (:starttext delimarg) endtext : string := (:endtext delimarg) delimlistarg : delimlist := (:delimlist delimarg) startposchg : int := (if : int (then (= "" textarg) startpos) (then (= 0 startpos) 1) (else startpos)) delimlistcl : delimlist := (if : delimlist (is-empty close) delimlistarg (copy delimlistarg close)) delimfirst : delim := (delim-first<-string-delimlist textarg delimlistcl)] (if : textblock (then // init is-init (textblock-init textblockarg)) (then // empty parent (is-empty parent) textblockarg) (then // no delim found (is-empty delimfirst) (textblock-delimnotfound textblockarg)) (then // close delim (is-close delimfirst) (textblock<-close-textblock delimfirst textblockarg)) (then // single delim (is-single delimfirst) (textblock<-single-textblock delimfirst textblockarg)) (else // open delim (textblock<-open-textblock delimfirst textblockarg)))) :test (test (textblock :text "<a" :startpos 1 :endpos 2 :children (textblocklist (textblock :text "<a" :startpos 1 :endpos 2 :delim (copy delimbracketangle :delimlist vx/data/textblock/delimlisttest1) :children (textblocklist (textblock :text "a" :startpos 2 :endpos 2)) (msgblock (msg :code "closedelimmissing" :detail (delim :name "delimclose" :starttext ">") :severity 2)))) (msgblock (msg :code "closedelimmissing" :detail (delim :name "delimclose" :starttext ">") :severity 2))) (textblock-parse-one (textblock :text "a" :startpos 2 :endpos 2 :delim (delim :delimlist vx/data/textblock/delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<a" :startpos 1 :endpos 2 :delim (copy delimbracketangle :delimlist vx/data/textblock/delimlisttest1) :parent (textblock :text "<a" :startpos 1 :endpos 2))))) (test (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim delimtest1 :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) (textblock-parse-one (textblock :text "<{a,b},{c d}>" :delim delimtest1))) (test (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13))) (textblock-parse-one (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim delimtest1 :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))) (test (textblock :text "a,b},{c d}>" :startpos 3 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))) (textblock-parse-one (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13))))) (test (textblock :text "a" :startpos 3 :endpos 3 :parent (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0) :parent (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))))) (textblock-parse-one (textblock :text "a,b},{c d}>" :startpos 3 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))))) (test (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0) :parent (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3))))) (textblock-parse-one (textblock :text "a" :startpos 3 :endpos 3 :parent (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0) :parent (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))))))) (test (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0))))) (textblock-parse-one (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0) :parent (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3))))))) (test (textblock :text "b" :startpos 5 :endpos 5 :parent (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)))))) (textblock-parse-one (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0))))))) (test (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5)))))) (textblock-parse-one (textblock :text "b" :startpos 5 :endpos 5 :parent (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)))))))) (test (textblock :startpos 7 :endpos 7 :parent (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0) :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5)))))))) (textblock-parse-one (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5)))))))) (test (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0) :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))))))) (textblock-parse-one (textblock :startpos 7 :endpos 7 :parent (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0) :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5)))))))))) (test (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0))))) (textblock-parse-one (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0) :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))))))))) (test (textblock :text "c d}>" :startpos 9 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))))) (textblock-parse-one (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0))))))) (test (textblock :text "c" :startpos 9 :endpos 9 :parent (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0) :parent (textblock :text "d}>" :startpos 11 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))))))) (textblock-parse-one (textblock :text "c d}>" :startpos 9 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))))))) (test (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0) :parent (textblock :text "d}>" :startpos 11 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9))))) (textblock-parse-one (textblock :text "c" :startpos 9 :endpos 9 :parent (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0) :parent (textblock :text "d}>" :startpos 11 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))))))))) (test (textblock :text "d}>" :startpos 11 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (delim :name "delimbracketangle" :starttext "<" :endtext ">" :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0))))) (textblock-parse-one (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0) :parent (textblock :text "d}>" :startpos 11 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9))))))) (test (textblock :text "d" :startpos 11 :endpos 11 :parent (textblock :text ">" :startpos 13 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)))))) (textblock-parse-one (textblock :text "d}>" :startpos 11 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (delim :name "delimbracketangle" :starttext "<" :endtext ">" :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0))))))) (test (textblock :text ">" :startpos 13 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11)))))) (textblock-parse-one (textblock :text "d" :startpos 11 :endpos 11 :parent (textblock :text ">" :startpos 13 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)))))))) (test (textblock :startpos 13 :endpos 13 :parent (textblock :startpos 14 :endpos 14 :delim (delim :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))) (textblock-parse-one (textblock :text ">" :startpos 13 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11)))))))) (test (textblock :startpos 14 :endpos 14 :delim (delim :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11)))))))) (textblock-parse-one (textblock :startpos 13 :endpos 13 :parent (textblock :startpos 14 :endpos 14 :delim (delim :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))))) (test (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))) (textblock-parse-one (textblock :startpos 14 :endpos 14 :delim (delim :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11)))))))))) (test (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))) (textblock-parse-one (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))))) :doc "Returns a textblock that has been parse a single level.") (func textblock-replace<-textblock-find-replace : textblock [textblockarg : textblock find : textblock replace : textblock] (if : textblock (then // empty (is-empty textblockarg) (empty textblock)) (then // found (and (== find textblockarg)) replace) (else // recursion (copy textblockarg :parent (textblock-replace<-textblock-find-replace (:parent textblockarg) find replace)))) :doc "Replace the given parent textblock.") (func textblock-startleft<-string-delim-offset : textblock [text : string delim : delim offset : int] (let [pos : int := (:pos delim) start : int := 1 end : int := (- pos 1)] (if (then (= "" text) (empty textblock)) (then (= 0 pos) (empty textblock)) (else (textblock :text (string<-string-start-end text start end) :startpos (+ offset start) :endpos (+ offset end) :curpos 0)))) :test (test (textblock :text "a" :startpos 1 :endpos 1) (textblock-startleft<-string-delim-offset "a,b" (delim :pos 2) 0)) :doc "Returns a textblock constructed from the text before the current delimiter start.") (func textblock-startright<-string-delim-offset : textblock [text : string delimin : delim offset : int] (let [startpos : int := (:pos delimin) starttext : string := (:starttext delimin) endtext : string := (:endtext delimin) delimlist : delimlist := (:delimlist delimin) close : delim := (if : delim (then (= endtext "") (empty delim)) (else (copy delimclose :starttext endtext))) delimlen : int := (switch : int starttext (case :nonwhitespace 0) (case :whitespace 0) (else (length<-string starttext))) curpos : int := 0] (if (then (= text "") (empty textblock)) (then (< startpos 0) (empty textblock)) (else (textblock :text (string<-string-start text startpos) :startpos (+ offset startpos) :curpos curpos :delim delimin :close close)))) :test (test (textblock :text ",b" :startpos 2 :delim (copy delimcomma :pos 2)) (textblock-startright<-string-delim-offset "a,b" (copy delimcomma :pos 2) 0)) (test (textblock :text "<b>c" :startpos 2 :delim (copy delimbracketangle :pos 2 :delimlist (delimlist delimbracketcurly)) :close (copy delimclose :starttext ">")) (textblock-startright<-string-delim-offset "a<b>c" (copy delimbracketangle :pos 2 :delimlist (delimlist delimbracketcurly)) 0)) :doc "Returns a textblock constructed from the text after the current delimiter start.") (func textblocklist<-textblocklist-remove : textblocklist [tblist : textblocklist remove : delim] (list<-list-filter : textblocklist tblist (fn : textblock [textblock : textblock] (let : textblock [delimcurr : delim := (:delim textblock) namecurr : string := (:name delimcurr) nameremove : string := (:name remove)] (if (!= namecurr nameremove) textblock)))) :test (test (textblocklist (textblock :text "+") (textblock :text "2") (textblock :text "3")) (textblocklist<-textblocklist-remove (textblocklist (textblock :text "+") (textblock :text " " :delim (copy delimwhitespace :pos 0)) (textblock :text "2") (textblock :text " " :delim (copy delimwhitespace :pos 0)) (textblock :text "3")) delimwhitespace)) :doc "Return a textblocklist with all removedelims removed.")
vx/data/textblock / delim
Description:
  • A delimiter type supporting start and end delimiters and positions.
Type Name:
  • delim
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    name
    vx/core/string
    false
    false
    starttext
    vx/core/string
    false
    false
    endtext
    vx/core/string
    false
    false
    pos
    vx/core/int
    false
    false
    delimlist
    vx/data/textblock/delimlist
    false
    false
Usage/Test Cases:
Source Code:
  • (type delim : struct :properties [name : string starttext : string endtext : string pos : int delimlist : delimlist] :doc "A delimiter type supporting start and end delimiters and positions.")
vx/data/textblock / delimlist
Description:
  • A list of delim.
Type Name:
  • delimlist
Extends:
  • :list
Default:
Allowed Types:
  • delim
Usage/Test Cases:
  • (test (new delimlist delimcomma delimwhitespace) (delimlist delimcomma delimwhitespace))
Source Code:
  • (type delimlist : list :allowtypes [delim] :test (test (new delimlist delimcomma delimwhitespace) (delimlist delimcomma delimwhitespace)) :doc "A list of delim.")
vx/data/textblock / textblock
Description:
  • A textblock is a tree of text used for parsing by delimter.
Type Name:
  • textblock
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    name
    vx/core/string
    false
    false
    text
    vx/core/string
    false
    false
    startpos
    vx/core/int
    false
    false
    endpos
    vx/core/int
    false
    false
    curpos
    vx/core/int
    false
    false
    line
    vx/core/int
    false
    false
    column
    vx/core/int
    false
    false
    delim
    vx/data/textblock/delim
    false
    false
    close
    vx/data/textblock/delim
    false
    false
    parent
    vx/data/textblock/textblock
    false
    false
    children
    vx/data/textblock/textblocklist
    false
    false
Usage/Test Cases:
Source Code:
  • (type textblock : struct :properties [name : string text : string startpos : int endpos : int curpos : int line : int column : int delim : delim close : delim parent : textblock children : textblocklist] :doc "A textblock is a tree of text used for parsing by delimter.")
vx/data/textblock / textblocklist
Description:
  • A list of textblock.
Type Name:
  • textblocklist
Extends:
  • :list
Default:
Allowed Types:
  • textblock
Usage/Test Cases:
Source Code:
  • (type textblocklist : list :allowtypes [textblock] :doc "A list of textblock.")
vx/data/textblock / delimbracketangle
Description:
  • Angle Bracket Delimiter
Constant Name:
  • delimbracketangle
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimbracketangle : delim (delim :name "delimbracketangle" :starttext "<" :endtext ">") :doc "Angle Bracket Delimiter")
vx/data/textblock / delimbracketcurly
Description:
  • Curly Bracket Delimiter
Constant Name:
  • delimbracketcurly
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimbracketcurly : delim (delim :name "delimbracketcurly" :starttext "{" :endtext "}") :doc "Curly Bracket Delimiter")
vx/data/textblock / delimbracketsquare
Description:
  • Square Bracket Delimiter
Constant Name:
  • delimbracketsquare
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimbracketsquare : delim (delim :name "delimbracketsquare" :starttext "[" :endtext "]") :doc "Square Bracket Delimiter")
vx/data/textblock / delimclose
Description:
  • A placeholder delimiter used to mark the close of whatever is the current delimiter.
Constant Name:
  • delimclose
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimclose : delim (delim :name "delimclose") :doc "A placeholder delimiter used to mark the close of whatever is the current delimiter.")
vx/data/textblock / delimclosing
Description:
  • A placeholder delimiter used to mark the closing of whatever is the current delimiter.
Constant Name:
  • delimclosing
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimclosing : delim (delim :name "delimclosing") :doc "A placeholder delimiter used to mark the closing of whatever is the current delimiter.")
vx/data/textblock / delimcomma
Description:
  • Comma Delimiter
Constant Name:
  • delimcomma
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimcomma : delim (delim :name "delimcomma" :starttext ",") :doc "Comma Delimiter")
vx/data/textblock / delimcomment
Description:
  • Comment Delimiter
Constant Name:
  • delimcomment
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimcomment : delim (delim :name "delimcomment" :starttext "//" :endtext "\n") :doc "Comment Delimiter")
vx/data/textblock / delimcommentblock
Description:
  • Block Comment Delimiter
Constant Name:
  • delimcommentblock
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimcommentblock : delim (delim :name "delimcommentblock" :starttext "/*" :endtext "*/") :doc "Block Comment Delimiter")
vx/data/textblock / delimline
Description:
  • New Line Delimiter
Constant Name:
  • delimline
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimline : delim (delim :name "delimline" :starttext "\n") :doc "New Line Delimiter")
vx/data/textblock / delimnonwhitespace
Description:
  • Placeholder for delimited non-whitespace
Constant Name:
  • delimnonwhitespace
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimnonwhitespace : delim (delim :name "delimnonwhitespace" :starttext ":nonwhitespace" :endtext ":whitespace") :doc "Placeholder for delimited non-whitespace")
vx/data/textblock / delimparen
Description:
  • Parenthesis Delimiter
Constant Name:
  • delimparen
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimparen : delim (delim :name "delimparen" :starttext "(" :endtext ")") :doc "Parenthesis Delimiter")
vx/data/textblock / delimquote
Description:
  • Quote Delimiter
Constant Name:
  • delimquote
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimquote : delim (delim :name "delimquote" :starttext quote :endtext quote) :doc "Quote Delimiter")
vx/data/textblock / delimquoteblock
Description:
  • Block Quote Delimiter
Constant Name:
  • delimquoteblock
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimquoteblock : delim (delim :name "delimquoteblock" :starttext "`" :endtext "`") :doc "Block Quote Delimiter")
vx/data/textblock / delimspace
Description:
  • Space Delimiter
Constant Name:
  • delimspace
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimspace : delim (delim :name "delimspace" :starttext " " :endtext " ") :doc "Space Delimiter")
vx/data/textblock / delimtest1
Description:
  • A delimiter used for test suite
Constant Name:
  • delimtest1
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimtest1 : delim (delim :delimlist delimlisttest1) :doc "A delimiter used for test suite")
vx/data/textblock / delimlisttest1
Description:
  • A delimiter used for test suite
Constant Name:
  • delimlisttest1
Type:
  • vx/data/textblock/delimlist
Usage/Test Cases:
Source Code:
  • (const delimlisttest1 : delimlist (delimlist delimtest2) :doc "A delimiter used for test suite")
vx/data/textblock / delimtest2
Description:
  • A delimiter used for test suite
Constant Name:
  • delimtest2
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimtest2 : delim (copy delimbracketangle :delimlist delimlisttest2) :doc "A delimiter used for test suite")
vx/data/textblock / delimlisttest2
Description:
  • A delimiter used for test suite
Constant Name:
  • delimlisttest2
Type:
  • vx/data/textblock/delimlist
Usage/Test Cases:
Source Code:
  • (const delimlisttest2 : delimlist (delimlist delimcomma delimtest3) :doc "A delimiter used for test suite")
vx/data/textblock / delimtest3
Description:
  • A delimiter used for test suite
Constant Name:
  • delimtest3
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimtest3 : delim (copy delimbracketcurly :delimlist delimlisttest3) :doc "A delimiter used for test suite")
vx/data/textblock / delimlisttest3
Description:
  • A delimiter used for test suite
Constant Name:
  • delimlisttest3
Type:
  • vx/data/textblock/delimlist
Usage/Test Cases:
Source Code:
  • (const delimlisttest3 : delimlist (delimlist delimcomma delimwhitespace) :doc "A delimiter used for test suite")
vx/data/textblock / delimtext
Description:
  • Placeholder for delimited text
Constant Name:
  • delimtext
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimtext : delim (delim :name "delimtext") :doc "Placeholder for delimited text")
vx/data/textblock / delimwhitespace
Description:
  • Placeholder for delimited whitespace
Constant Name:
  • delimwhitespace
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimwhitespace : delim (delim :name "delimwhitespace" :starttext ":whitespace") :doc "Placeholder for delimited whitespace")
vx/data/textblock / children<-textblock
Description:
  • Returns the child textblocks from a given textblock.
Function Name:
  • children<-textblock
Return Type:
  • vx/data/textblock/textblocklist
Arguments:
  • Name
    Type
    Generic
    Description
    textblock
    vx/data/textblock/textblock
Usage/Test Cases:
Source Code:
  • (func children<-textblock : textblocklist [textblock : textblock] (:children textblock) :doc "Returns the child textblocks from a given textblock.")
vx/data/textblock / delim-first<-delim-delim
Description:
  • Returns non-empty delim with lowest, non-negative startpos found in string.
Function Name:
  • delim-first<-delim-delim
Return Type:
  • vx/data/textblock/delim
Arguments:
  • Name
    Type
    Generic
    Description
    delim1
    vx/data/textblock/delim
    delim2
    vx/data/textblock/delim
Usage/Test Cases:
  • (test (copy delimcomma :pos 1) (delim-first<-delim-delim (copy delimspace :pos 2) (copy delimcomma :pos 1)))
  • (test (empty delim) (delim-first<-delim-delim (delim :pos 0) (empty delim)))
Source Code:
  • (func delim-first<-delim-delim : delim [delim1 : delim delim2 : delim] (let : delim [pos1 : int := (:pos delim1) pos2 : int := (:pos delim2)] (if : delim (then (= 0 pos2) delim1) (then (= 0 pos1) delim2) (then (is-empty delim2) delim1) (then (is-empty delim1) delim2) (then (< pos2 pos1) delim2) (else delim1))) :test (test (copy delimcomma :pos 1) (delim-first<-delim-delim (copy delimspace :pos 2) (copy delimcomma :pos 1))) (test (empty delim) (delim-first<-delim-delim (delim :pos 0) (empty delim))) :doc "Returns non-empty delim with lowest, non-negative startpos found in string.")
vx/data/textblock / delim-first<-string-delimlist
Description:
  • Returns delim with lowest startpos found in string.
Function Name:
  • delim-first<-string-delimlist
Return Type:
  • vx/data/textblock/delim
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    delimlist
    vx/data/textblock/delimlist
Usage/Test Cases:
  • (test (copy delimcomma :pos 2) (delim-first<-string-delimlist "a, b" (delimlist delimspace delimcomma)))
Source Code:
  • (func delim-first<-string-delimlist : delim [text : string delimlist : delimlist] (if : delim (then (is-empty delimlist) (empty delim)) (else (let : delim [resolvedlist : delimlist := (delimlist-pos<-string-delimlist text delimlist)] (any<-list-start-reduce : delim resolvedlist (empty delim) delim-first<-delim-delim)))) :test (test (copy delimcomma :pos 2) (delim-first<-string-delimlist "a, b" (delimlist delimspace delimcomma))) :doc "Returns delim with lowest startpos found in string.")
vx/data/textblock / delim-pos<-string-delim
Description:
  • Return a delim with istart updated to position of first starttext.
Function Name:
  • delim-pos<-string-delim
Return Type:
  • vx/data/textblock/delim
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    delim
    vx/data/textblock/delim
Usage/Test Cases:
  • (test (copy delimcomma :pos 2) (delim-pos<-string-delim "a,b" delimcomma))
Source Code:
  • (func delim-pos<-string-delim : delim [text : string delim : delim] (let : delim [find : string := (:starttext delim) pos : int := (typ/int<-string-findkeyword text find)] (if : delim (then (= pos 0) delim) (else (copy delim :pos pos)))) :test (test (copy delimcomma :pos 2) (delim-pos<-string-delim "a,b" delimcomma)) :doc "Return a delim with istart updated to position of first starttext.")
vx/data/textblock / delimlist-pos<-string-delimlist
Description:
  • Returns a delimlist with each delim updated to position of first starttext.
Function Name:
  • delimlist-pos<-string-delimlist
Return Type:
  • vx/data/textblock/delimlist
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    delimlist
    vx/data/textblock/delimlist
Usage/Test Cases:
  • (test (delimlist (copy delimspace :pos 3) (copy delimcomma :pos 2)) (delimlist-pos<-string-delimlist "a, b" (delimlist delimspace delimcomma)))
Source Code:
  • (func delimlist-pos<-string-delimlist : delimlist [text : string delimlist : delimlist] (list<-list : delimlist delimlist (fn : delim [delim : delim] (delim-pos<-string-delim text delim))) :test (test (delimlist (copy delimspace :pos 3) (copy delimcomma :pos 2)) (delimlist-pos<-string-delimlist "a, b" (delimlist delimspace delimcomma))) :doc "Returns a delimlist with each delim updated to position of first starttext.")
vx/data/textblock / is-close
Description:
  • Return true if the given delim is a close delim.
Function Name:
  • is-close
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    delimarg
    vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (func is-close : boolean [delimarg : delim] (= (:name delimarg) (:name delimclose)) :doc "Return true if the given delim is a close delim.")
vx/data/textblock / is-single
Description:
  • Return true if the given delim is a single text delim.
Function Name:
  • is-single
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    delimarg
    vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (func is-single : boolean [delimarg : delim] (and (!= "" (:starttext delimarg)) (= "" (:endtext delimarg))) :doc "Return true if the given delim is a single text delim.")
vx/data/textblock / stringlist<-textblocklist
Description:
  • Returns a stringlist from each (:text textblock).
Function Name:
  • stringlist<-textblocklist
Return Type:
  • vx/core/stringlist
Arguments:
  • Name
    Type
    Generic
    Description
    textblocklist
    vx/data/textblock/textblocklist
Usage/Test Cases:
  • (test (stringlist "a" "b") (stringlist<-textblocklist (textblocklist (textblock :text "a") (textblock :text "b"))))
Source Code:
  • (func stringlist<-textblocklist : stringlist [textblocklist : textblocklist] (list<-list : stringlist textblocklist text<-textblock) :test (test (stringlist "a" "b") (stringlist<-textblocklist (textblocklist (textblock :text "a") (textblock :text "b")))) :doc "Returns a stringlist from each (:text textblock).")
vx/data/textblock / text<-textblock
Description:
  • Returns the text from a given textblock.
Function Name:
  • text<-textblock
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    block
    vx/data/textblock/textblock
Usage/Test Cases:
  • (test "a" (text<-textblock (textblock :text "a")))
Source Code:
  • (func text<-textblock : string [block : textblock] (:text block) :test (test "a" (text<-textblock (textblock :text "a"))) :doc "Returns the text from a given textblock.")
vx/data/textblock / textblock<-close-textblock
Description:
  • Returns a textblock after a close delim found.
Function Name:
  • textblock<-close-textblock
Return Type:
  • vx/data/textblock/textblock
Arguments:
  • Name
    Type
    Generic
    Description
    close
    vx/data/textblock/delim
    textblockarg
    vx/data/textblock/textblock
Usage/Test Cases:
  • (test (textblock :text "b" :startpos 5 :endpos 5 :parent (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)))))) (textblock<-close-textblock (copy delimclose :starttext "}" :pos 2) (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)))))))
  • (test (textblock :startpos 13 :endpos 13 :parent (textblock :startpos 14 :endpos 14 :delim (delim :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))) (textblock<-close-textblock (copy delimclose :starttext ">" :pos 1) (textblock :text ">" :startpos 13 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))))
Source Code:
  • (func textblock<-close-textblock : textblock [close : delim textblockarg : textblock] (let : textblock [text : string := (:text textblockarg) parent : textblock := (:parent textblockarg) startpos : int := (:startpos textblockarg) endpos : int := (:endpos textblockarg) pos : int := (:pos close) textclose : string := (:starttext close) lenclose : int := (length<-string textclose) posminus : int := (-1 pos) startleft : int := startpos startclose : int := (+ startpos posminus) endclose : int := (switch : int textclose (case :whitespace (int<-string-findkeyword text :nonwhitespace)) (else (+ (-1 startclose) lenclose))) endleft : int := (if : int (= 1 pos) startclose (-1 startclose)) startright : int := (+1 endclose) endright : int := (if : int (< endpos startright) startright endpos) textleft : string := (typ/string<-string-end text posminus) textright : string := (typ/string<-string-start text (+ pos lenclose)) find : textblock := (textblock-findparent<-textblock parent) closefind : delim := (:close find) textfind : string := (:text find) startfind : int := (:startpos find) delimfind : delim := (:delim find) delimright : delim := (delim :delimlist (:delimlist delimfind)) lenfind : int := (- (+1 endclose) startfind) textreplace : string := (string<-string-end textfind lenfind) replace : textblock := (copy find :text textreplace :endpos endclose :delim (copy delimfind :delimlist (empty delimlist)) :close delimclosing) parentchg : textblock := (textblock-replace<-textblock-find-replace parent find replace)] (textblock :text textleft :startpos startleft :endpos endleft :parent (copy textblockarg :text textright :startpos startright :endpos endright :delim delimright :close closefind :parent parentchg))) :test (test (textblock :text "b" :startpos 5 :endpos 5 :parent (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)))))) (textblock<-close-textblock (copy delimclose :starttext "}" :pos 2) (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0))))))) (test (textblock :startpos 13 :endpos 13 :parent (textblock :startpos 14 :endpos 14 :delim (delim :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))) (textblock<-close-textblock (copy delimclose :starttext ">" :pos 1) (textblock :text ">" :startpos 13 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11)))))))) :doc "Returns a textblock after a close delim found.")
vx/data/textblock / textblock<-empty-textblock
Description:
  • Returns a textblock after an empty delim found.
Function Name:
  • textblock<-empty-textblock
Return Type:
  • vx/data/textblock/textblock
Arguments:
  • Name
    Type
    Generic
    Description
    empty
    vx/data/textblock/delim
    textblockarg
    vx/data/textblock/textblock
Usage/Test Cases:
Source Code:
  • (func textblock<-empty-textblock : textblock [empty : delim textblockarg : textblock] :doc "Returns a textblock after an empty delim found.")
vx/data/textblock / textblock<-open-textblock
Description:
  • Returns a textblock after a close delim found.
Function Name:
  • textblock<-open-textblock
Return Type:
  • vx/data/textblock/textblock
Arguments:
  • Name
    Type
    Generic
    Description
    open
    vx/data/textblock/delim
    textblockarg
    vx/data/textblock/textblock
Usage/Test Cases:
  • (test (textblock :text "c}" :startpos 4 :endpos 5 :close (copy delimclose :starttext "}") :parent (textblock :text "{c}" :startpos 3 :endpos 5 :delim (copy delimbracketcurly :pos 0) :parent (textblock :text "ab{c}" :startpos 1 :endpos 5 :children (textblocklist (textblock :text "ab" :startpos 1 :endpos 2))))) (textblock<-open-textblock (copy delimbracketcurly :pos 3) (textblock :text "ab{c}" :startpos 1 :endpos 5 :delim delimbracketcurly :parent (textblock :text "ab{c}" :startpos 1 :endpos 5))))
  • (test (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13))) (textblock<-open-textblock (copy delimtest2 :pos 1) (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim delimtest1 :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13))))
  • (test (textblock :text "a,b},{c d}>" :startpos 3 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))) (textblock<-open-textblock (copy delimtest3 :pos 1) (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))))
Source Code:
  • (func textblock<-open-textblock : textblock [open : delim textblockarg : textblock] (let : textblock [text : string := (:text textblockarg) parent : textblock := (:parent textblockarg) startpos : int := (:startpos textblockarg) endpos : int := (:endpos textblockarg) delima : delim := (:delim textblockarg) pos : int := (:pos open) textopen : string := (:starttext open) textclose : string := (:endtext open) delimlistl : delimlist := (:delimlist open) lenopen : int := (length<-string textopen) posminus : int := (-1 pos) startleft : int := (if : int (= pos 1) (-1 startpos) startpos) endleft : int := (if : int (= pos 1) (-1 startpos) (+ (-1 startleft) posminus)) startright : int := (+ startpos posminus lenopen) startopen : int := (+ startpos posminus) textleft : string := (typ/string<-string-end text posminus) textpar : string := (typ/string<-string-start text pos) textright : string := (typ/string<-string-start text (+ pos lenopen)) close : delim := (copy delimclose :starttext textclose) tbleft : textblock := (if : textblock (then (= "" textleft) (empty textblock)) (else (textblock :text textleft :startpos startleft :endpos endleft))) tbpar1 : textblock := (copy textblockarg :text textpar :startpos startopen :delim (copy open :pos 0 :delimlist (:delimlist delima)) :parent parent) tbfind : textblock := (if : textblock (then (= "" textleft) (empty textblock)) (else (textblock-findparent<-textblock parent))) tbparent : textblock := (if : textblock (then (is-empty tbfind) tbpar1) (else (textblock-addchild<-textblock-find-child tbpar1 tbfind tbleft)))] (textblock :text textright :startpos startright :endpos endpos :delim (delim :delimlist delimlistl) :close close :parent tbparent)) :test (test (textblock :text "c}" :startpos 4 :endpos 5 :close (copy delimclose :starttext "}") :parent (textblock :text "{c}" :startpos 3 :endpos 5 :delim (copy delimbracketcurly :pos 0) :parent (textblock :text "ab{c}" :startpos 1 :endpos 5 :children (textblocklist (textblock :text "ab" :startpos 1 :endpos 2))))) (textblock<-open-textblock (copy delimbracketcurly :pos 3) (textblock :text "ab{c}" :startpos 1 :endpos 5 :delim delimbracketcurly :parent (textblock :text "ab{c}" :startpos 1 :endpos 5)))) (test (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13))) (textblock<-open-textblock (copy delimtest2 :pos 1) (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim delimtest1 :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))) (test (textblock :text "a,b},{c d}>" :startpos 3 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))) (textblock<-open-textblock (copy delimtest3 :pos 1) (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13))))) :doc "Returns a textblock after a close delim found.")
vx/data/textblock / textblock<-single-textblock
Description:
  • Returns a textblock after a single value delim found.
Function Name:
  • textblock<-single-textblock
Return Type:
  • vx/data/textblock/textblock
Arguments:
  • Name
    Type
    Generic
    Description
    single
    vx/data/textblock/delim
    textblockarg
    vx/data/textblock/textblock
Usage/Test Cases:
  • (test (textblock :text "a" :startpos 3 :endpos 3 :parent (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0) :parent (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :pos 0) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))))) (textblock<-single-textblock (copy delimcomma :pos 2) (textblock :text "a,b},{c d}>" :startpos 3 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :pos 0) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13))))))
  • (test (textblock :startpos 7 :endpos 7 :parent (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0) :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5)))))))) (textblock<-single-textblock (copy delimcomma :pos 1) (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))))))))
  • (test (textblock :text "c" :startpos 9 :endpos 9 :parent (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0) :parent (textblock :text "d}>" :startpos 11 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))))))) (textblock<-single-textblock (copy delimwhitespace :pos 2) (textblock :text "c d}>" :startpos 9 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0))))))))
Source Code:
  • (func textblock<-single-textblock : textblock [single : delim textblockarg : textblock] (let : textblock [text : string := (:text textblockarg) parent : textblock := (:parent textblockarg) startpos : int := (:startpos textblockarg) endpos : int := (:endpos textblockarg) pos : int := (:pos single) origsingle : string := (:starttext single) textsingle : string := (switch : string origsingle (case :whitespace (let : string [text2 : string := (typ/string<-string-start text pos) pos2 : int := (typ/int<-string-findkeyword text2 :nonwhitespace) pos3 : int := (if : int (then (= 0 pos2) (length<-string text2)) (then (= pos2 pos) pos2) (else (-1 pos2)))] (typ/string<-string-start-end text pos pos3))) (else origsingle)) delimlistl : delimlist := (:delimlist single) lensingle : int := (length<-string textsingle) posminus : int := (-1 pos) startleft : int := startpos startsingle : int := (+ startpos posminus) endsingle : int := (switch : int textsingle (case :whitespace (int<-string-findkeyword text :nonwhitespace)) (else (+ (-1 startsingle) lensingle))) endleft : int := (if : int (= startsingle startpos) startsingle (-1 startsingle)) startright : int := (+1 endsingle) textleft : string := (typ/string<-string-end text posminus) textpar : string := (typ/string<-string-start text pos) textright : string := (typ/string<-string-start text (+ pos lensingle))] (textblock :text textleft :startpos startleft :endpos endleft :delim (delim :delimlist delimlistl) :parent (textblock :text textsingle :startpos startsingle :endpos endsingle :delim (copy single :pos 0 :delimlist (empty delimlist)) :parent (copy textblockarg :text textright :startpos startright :endpos endpos)))) :test (test (textblock :text "a" :startpos 3 :endpos 3 :parent (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0) :parent (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :pos 0) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))))) (textblock<-single-textblock (copy delimcomma :pos 2) (textblock :text "a,b},{c d}>" :startpos 3 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :pos 0) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))))) (test (textblock :startpos 7 :endpos 7 :parent (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0) :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5)))))))) (textblock<-single-textblock (copy delimcomma :pos 1) (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5)))))))) (test (textblock :text "c" :startpos 9 :endpos 9 :parent (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0) :parent (textblock :text "d}>" :startpos 11 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))))))) (textblock<-single-textblock (copy delimwhitespace :pos 2) (textblock :text "c d}>" :startpos 9 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))))))) :doc "Returns a textblock after a single value delim found.")
vx/data/textblock / textblock<-string-delim
Description:
  • Returns a textblock from a string and delim.
Function Name:
  • textblock<-string-delim
Return Type:
  • vx/data/textblock/textblock
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    delim
    vx/data/textblock/delim
Usage/Test Cases:
  • (test (textblock :text "a" :startpos 0 :endpos 1 :delim delimcomma) (textblock<-string-delim "a" delimcomma))
Source Code:
  • (func textblock<-string-delim : textblock [text : string delim : delim] (textblock :text text :delim delim :startpos 0 :endpos (length<-string text)) :test (test (textblock :text "a" :startpos 0 :endpos 1 :delim delimcomma) (textblock<-string-delim "a" delimcomma)) :doc "Returns a textblock from a string and delim.")
vx/data/textblock / textblock<-textblock-delim
Description:
  • Returns a parsed textblock from an unparsed one.
Function Name:
  • textblock<-textblock-delim
Return Type:
  • vx/data/textblock/textblock
Arguments:
  • Name
    Type
    Generic
    Description
    textblock
    vx/data/textblock/textblock
    delim
    vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (func textblock<-textblock-delim : textblock [textblock : textblock delim : delim] :doc "Returns a parsed textblock from an unparsed one.")
vx/data/textblock / textblock-addchild<-textblock-find-child
Description:
  • Add the child to the given parent textblock.
Function Name:
  • textblock-addchild<-textblock-find-child
Return Type:
  • vx/data/textblock/textblock
Arguments:
  • Name
    Type
    Generic
    Description
    textblockarg
    vx/data/textblock/textblock
    find
    vx/data/textblock/textblock
    child
    vx/data/textblock/textblock
Usage/Test Cases:
Source Code:
  • (func textblock-addchild<-textblock-find-child : textblock [textblockarg : textblock find : textblock child : textblock] (if : textblock (then // empty (is-empty textblockarg) (empty textblock)) (then // found (and (== find textblockarg)) (copy textblockarg :children (copy (:children textblockarg) child))) (else // recursion (copy textblockarg :parent (textblock-addchild<-textblock-find-child (:parent textblockarg) find child)))) :doc "Add the child to the given parent textblock.")
vx/data/textblock / textblock-delimnotfound
Description:
  • Returns a textblock when a delim is not found.
Function Name:
  • textblock-delimnotfound
Return Type:
  • vx/data/textblock/textblock
Arguments:
  • Name
    Type
    Generic
    Description
    textblockarg
    vx/data/textblock/textblock
Usage/Test Cases:
  • (test (textblock :text "<a" :startpos 1 :endpos 2 :children (textblocklist (textblock :text "<a" :startpos 1 :endpos 2 :delim (copy delimbracketangle :delimlist vx/data/textblock/delimlisttest1) :children (textblocklist (textblock :text "a" :startpos 2 :endpos 2)) (msgblock (msg :code "closedelimmissing" :detail (delim :name "delimclose" :starttext ">") :severity 2)))) (msgblock (msg :code "closedelimmissing" :detail (delim :name "delimclose" :starttext ">") :severity 2))) (textblock-delimnotfound (textblock :text "a" :startpos 2 :endpos 2 :delim (delim :delimlist vx/data/textblock/delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<a" :startpos 1 :endpos 2 :delim (copy delimbracketangle :delimlist vx/data/textblock/delimlisttest1) :parent (textblock :text "<a" :startpos 1 :endpos 2)))))
  • (test (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0) :parent (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :pos 0) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3))))) (textblock-delimnotfound (textblock :text "a" :startpos 3 :endpos 3 :parent (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0) :parent (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :pos 0) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13))))))))
  • (test (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5)))))) (textblock-delimnotfound (textblock :text "b" :startpos 5 :endpos 5 :parent (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext ">") :parent (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0))))))))
  • (test (textblock :startpos 14 :endpos 14 :delim (delim :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11)))))))) (textblock-delimnotfound (textblock :startpos 13 :endpos 13 :parent (textblock :startpos 14 :endpos 14 :delim (delim :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11)))))))))
  • (test (textblock :text "\"b\" 1,\"2\"" :startpos 5 :endpos 13 :delim (delim :delimlist (delimlist vx/data/textblock/delimline vx/data/textblock/delimquote vx/data/textblock/delimcomma)) :parent (textblock :text "\"a\",\"b\" 1,\"2\"" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "\"a\"" :startpos 1 :endpos 3 :delim (delim :name "delimquote" :starttext "\"" :endtext "\"") :children (textblocklist (textblock :text "a" :startpos 2 :endpos 2))) (textblock :text "," :startpos 4 :endpos 4 :delim (delim :name "delimcomma" :starttext ","))))) (textblock-delimnotfound (textblock :text "," :startpos 4 :endpos 4 :delim (delim :name "delimcomma" :starttext ",") :parent (textblock :text "\"b\" 1,\"2\"" :startpos 5 :endpos 13 :delim (delim :delimlist (delimlist vx/data/textblock/delimline vx/data/textblock/delimquote vx/data/textblock/delimcomma)) :parent (textblock :text "\"a\",\"b\" 1,\"2\"" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "\"a\"" :startpos 1 :endpos 3 :delim (delim :name "delimquote" :starttext "\"" :endtext "\"") :children (textblocklist (textblock :text "a" :startpos 2 :endpos 2)))))))))
Source Code:
  • (func textblock-delimnotfound : textblock [textblockarg : textblock] (let : textblock [text : string := (:text textblockarg) delima : delim := (:delim textblockarg) close : delim := (:close textblockarg) parent : textblock := (:parent textblockarg) childp : textblocklist := (:children parent) delimp : delim := (:delim parent) delims : delimlist := (:delimlist delimp)] (if : textblock (then // if delim not closed then error (! (is-empty close)) (let : textblock [msgerr : msg := (msg<-error "closedelimmissing" close) child : textblock := (copy textblockarg :delim (empty delim) :close (empty delim) :parent (empty textblock)) find : textblock := (textblock-findparent<-textblock parent) childrenf : textblocklist := (:children find) childrenr : textblocklist := (copy childrenf child) replace : textblock := (copy find msgerr :children childrenr) parent2 : textblock := (textblock-replace<-textblock-find-replace parent find replace) gparent : textblock := (:parent parent2) parent3 : textblock := (copy parent2 :parent (empty textblock)) childreng : textblocklist := (:children gparent) childrenc : textblocklist := (copy childreng parent3)] (copy gparent :children childrenc msgerr))) (then // if empty parent then textblockarg (is-empty parent) textblockarg) (else // else add textblockarg to parent and return parent (let : textblock [delimchg : delim := (if : delim (is-empty (:delimlist delima)) delima (copy delima :delimlist (empty delimlist))) child : textblock := (if : textblock (= "" text) (empty textblock) (copy textblockarg :delim delimchg :parent (empty textblock))) find : textblock := (textblock-findparent<-textblock parent) closef : delim := (:close find) closing : boolean := (if : boolean (== closef delimclosing) true)] (if : textblock (then closing (let : textblock [parent2 : textblock := (:parent find) find2 : textblock := (textblock-findparent<-textblock parent2) children1 : textblocklist := (if : textblocklist (is-empty child) (:children find) (copy (:children find) child)) replace1 : textblock := (copy find :close (empty delim) :parent (empty textblock) :children children1)] (if : textblock (then (is-empty find2) (copy parent :parent (copy parent2 :children (textblocklist replace1)))) (else (let : textblock [children2 : textblocklist := (copy (:children find2) replace1) replace2 : textblock := (copy find2 :close (empty delim) :children children2) replace : textblock := (textblock-replace<-textblock-find-replace parent2 find2 replace2)] (textblock-replace<-textblock-find-replace parent find replace)))))) (then (is-empty child) parent) (else (textblock-addchild<-textblock-find-child parent find child))))))) :test (test (textblock :text "<a" :startpos 1 :endpos 2 :children (textblocklist (textblock :text "<a" :startpos 1 :endpos 2 :delim (copy delimbracketangle :delimlist vx/data/textblock/delimlisttest1) :children (textblocklist (textblock :text "a" :startpos 2 :endpos 2)) (msgblock (msg :code "closedelimmissing" :detail (delim :name "delimclose" :starttext ">") :severity 2)))) (msgblock (msg :code "closedelimmissing" :detail (delim :name "delimclose" :starttext ">") :severity 2))) (textblock-delimnotfound (textblock :text "a" :startpos 2 :endpos 2 :delim (delim :delimlist vx/data/textblock/delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<a" :startpos 1 :endpos 2 :delim (copy delimbracketangle :delimlist vx/data/textblock/delimlisttest1) :parent (textblock :text "<a" :startpos 1 :endpos 2))))) (test (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0) :parent (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :pos 0) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3))))) (textblock-delimnotfound (textblock :text "a" :startpos 3 :endpos 3 :parent (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0) :parent (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :pos 0) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))))))) (test (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5)))))) (textblock-delimnotfound (textblock :text "b" :startpos 5 :endpos 5 :parent (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext ">") :parent (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)))))))) (test (textblock :startpos 14 :endpos 14 :delim (delim :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11)))))))) (textblock-delimnotfound (textblock :startpos 13 :endpos 13 :parent (textblock :startpos 14 :endpos 14 :delim (delim :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))))) (test (textblock :text "\"b\" 1,\"2\"" :startpos 5 :endpos 13 :delim (delim :delimlist (delimlist vx/data/textblock/delimline vx/data/textblock/delimquote vx/data/textblock/delimcomma)) :parent (textblock :text "\"a\",\"b\" 1,\"2\"" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "\"a\"" :startpos 1 :endpos 3 :delim (delim :name "delimquote" :starttext "\"" :endtext "\"") :children (textblocklist (textblock :text "a" :startpos 2 :endpos 2))) (textblock :text "," :startpos 4 :endpos 4 :delim (delim :name "delimcomma" :starttext ","))))) (textblock-delimnotfound (textblock :text "," :startpos 4 :endpos 4 :delim (delim :name "delimcomma" :starttext ",") :parent (textblock :text "\"b\" 1,\"2\"" :startpos 5 :endpos 13 :delim (delim :delimlist (delimlist vx/data/textblock/delimline vx/data/textblock/delimquote vx/data/textblock/delimcomma)) :parent (textblock :text "\"a\",\"b\" 1,\"2\"" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "\"a\"" :startpos 1 :endpos 3 :delim (delim :name "delimquote" :starttext "\"" :endtext "\"") :children (textblocklist (textblock :text "a" :startpos 2 :endpos 2))))))))) :doc "Returns a textblock when a delim is not found.")
vx/data/textblock / textblock-findparent<-textblock
Description:
  • Find a parent that accepts a child.
Function Name:
  • textblock-findparent<-textblock
Return Type:
  • vx/data/textblock/textblock
Arguments:
  • Name
    Type
    Generic
    Description
    textblockarg
    vx/data/textblock/textblock
Usage/Test Cases:
Source Code:
  • (func textblock-findparent<-textblock : textblock [textblockarg : textblock] (let : textblock [delimcurr : delim := (:delim textblockarg) parent : textblock := (:parent textblockarg) children : textblocklist := (:children textblockarg) starttext : string := (:starttext delimcurr) endtext : string := (:endtext delimcurr)] (if : textblock (then // empty (is-empty textblockarg) (empty textblock)) (then // allows children (or (is-empty parent) (and (!= "" starttext) (!= "" endtext))) textblockarg) (else // recursion (textblock-findparent<-textblock parent)))) :doc "Find a parent that accepts a child.")
vx/data/textblock / textblock-init
Description:
  • Returns a textblock ready for parsing.
Function Name:
  • textblock-init
Return Type:
  • vx/data/textblock/textblock
Arguments:
  • Name
    Type
    Generic
    Description
    textblockarg
    vx/data/textblock/textblock
Usage/Test Cases:
  • (test (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim delimtest1 :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) (textblock-init (textblock :text "<{a,b},{c d}>" :delim delimtest1)))
Source Code:
  • (func textblock-init : textblock [textblockarg : textblock] (let : textblock [text : string := (:text textblockarg) startpos : int := (if : int (= "" text) 0 1) endpos : int := (if : int (= "" text) 0 (length<-string text))] (copy textblockarg :startpos startpos :endpos endpos :parent (copy textblockarg :startpos startpos :endpos endpos :delim (empty delim)))) :test (test (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim delimtest1 :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) (textblock-init (textblock :text "<{a,b},{c d}>" :delim delimtest1))) :doc "Returns a textblock ready for parsing.")
vx/data/textblock / textblock-parse
Description:
  • Returns a fully parsed textblock from an initialized textblock.
Function Name:
  • textblock-parse
Return Type:
  • vx/data/textblock/textblock
Arguments:
  • Name
    Type
    Generic
    Description
    textblock
    vx/data/textblock/textblock
Usage/Test Cases:
  • (test (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))) (textblock-parse (textblock :text "<{a,b},{c d}>" :delim delimtest1)))
Source Code:
  • (func textblock-parse : textblock [textblock : textblock] (collection/any<-for-until-loop-max : textblock textblock (fn : boolean [current : textblock] (is-empty (:parent current))) (fn : textblock [current : textblock] (textblock-parse-one current)) 50000) :bigospace :n^n :bigotime :n^n :test (test (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))) (textblock-parse (textblock :text "<{a,b},{c d}>" :delim delimtest1))) :doc "Returns a fully parsed textblock from an initialized textblock.")
vx/data/textblock / textblock-parse<-string-delim
Description:
  • Returns a fully parsed textblock from a string and delim.
Function Name:
  • textblock-parse<-string-delim
Return Type:
  • vx/data/textblock/textblock
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    delim
    vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (func textblock-parse<-string-delim : textblock [text : string delim : delim] (let : textblock [textblockinit : textblock := (textblock<-string-delim text delim)] (textblock-parse textblockinit)) :doc "Returns a fully parsed textblock from a string and delim.")
vx/data/textblock / textblock-parse-one
Description:
  • Returns a textblock that has been parse a single level.
Function Name:
  • textblock-parse-one
Return Type:
  • vx/data/textblock/textblock
Arguments:
  • Name
    Type
    Generic
    Description
    textblockarg
    vx/data/textblock/textblock
Usage/Test Cases:
  • (test (textblock :text "<a" :startpos 1 :endpos 2 :children (textblocklist (textblock :text "<a" :startpos 1 :endpos 2 :delim (copy delimbracketangle :delimlist vx/data/textblock/delimlisttest1) :children (textblocklist (textblock :text "a" :startpos 2 :endpos 2)) (msgblock (msg :code "closedelimmissing" :detail (delim :name "delimclose" :starttext ">") :severity 2)))) (msgblock (msg :code "closedelimmissing" :detail (delim :name "delimclose" :starttext ">") :severity 2))) (textblock-parse-one (textblock :text "a" :startpos 2 :endpos 2 :delim (delim :delimlist vx/data/textblock/delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<a" :startpos 1 :endpos 2 :delim (copy delimbracketangle :delimlist vx/data/textblock/delimlisttest1) :parent (textblock :text "<a" :startpos 1 :endpos 2)))))
  • (test (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim delimtest1 :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) (textblock-parse-one (textblock :text "<{a,b},{c d}>" :delim delimtest1)))
  • (test (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13))) (textblock-parse-one (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim delimtest1 :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13))))
  • (test (textblock :text "a,b},{c d}>" :startpos 3 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))) (textblock-parse-one (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))))
  • (test (textblock :text "a" :startpos 3 :endpos 3 :parent (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0) :parent (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))))) (textblock-parse-one (textblock :text "a,b},{c d}>" :startpos 3 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13))))))
  • (test (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0) :parent (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3))))) (textblock-parse-one (textblock :text "a" :startpos 3 :endpos 3 :parent (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0) :parent (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13))))))))
  • (test (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0))))) (textblock-parse-one (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0) :parent (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3)))))))
  • (test (textblock :text "b" :startpos 5 :endpos 5 :parent (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)))))) (textblock-parse-one (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)))))))
  • (test (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5)))))) (textblock-parse-one (textblock :text "b" :startpos 5 :endpos 5 :parent (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0))))))))
  • (test (textblock :startpos 7 :endpos 7 :parent (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0) :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5)))))))) (textblock-parse-one (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))))))))
  • (test (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0) :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))))))) (textblock-parse-one (textblock :startpos 7 :endpos 7 :parent (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0) :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))))))))))
  • (test (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0))))) (textblock-parse-one (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0) :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5)))))))))
  • (test (textblock :text "c d}>" :startpos 9 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))))) (textblock-parse-one (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))))))
  • (test (textblock :text "c" :startpos 9 :endpos 9 :parent (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0) :parent (textblock :text "d}>" :startpos 11 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))))))) (textblock-parse-one (textblock :text "c d}>" :startpos 9 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0))))))))
  • (test (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0) :parent (textblock :text "d}>" :startpos 11 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9))))) (textblock-parse-one (textblock :text "c" :startpos 9 :endpos 9 :parent (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0) :parent (textblock :text "d}>" :startpos 11 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0))))))))))
  • (test (textblock :text "d}>" :startpos 11 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (delim :name "delimbracketangle" :starttext "<" :endtext ">" :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0))))) (textblock-parse-one (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0) :parent (textblock :text "d}>" :startpos 11 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9)))))))
  • (test (textblock :text "d" :startpos 11 :endpos 11 :parent (textblock :text ">" :startpos 13 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)))))) (textblock-parse-one (textblock :text "d}>" :startpos 11 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (delim :name "delimbracketangle" :starttext "<" :endtext ">" :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)))))))
  • (test (textblock :text ">" :startpos 13 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11)))))) (textblock-parse-one (textblock :text "d" :startpos 11 :endpos 11 :parent (textblock :text ">" :startpos 13 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0))))))))
  • (test (textblock :startpos 13 :endpos 13 :parent (textblock :startpos 14 :endpos 14 :delim (delim :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))) (textblock-parse-one (textblock :text ">" :startpos 13 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))))
  • (test (textblock :startpos 14 :endpos 14 :delim (delim :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11)))))))) (textblock-parse-one (textblock :startpos 13 :endpos 13 :parent (textblock :startpos 14 :endpos 14 :delim (delim :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11)))))))))
  • (test (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))) (textblock-parse-one (textblock :startpos 14 :endpos 14 :delim (delim :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))))))
  • (test (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))) (textblock-parse-one (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11)))))))))
Source Code:
  • (func textblock-parse-one : textblock [textblockarg : textblock] (let : textblock [delimarg : delim := (:delim textblockarg) close : delim := (:close textblockarg) startpos : int := (:startpos textblockarg) textarg : string := (:text textblockarg) parent : textblock := (:parent textblockarg) is-init : boolean := (and (is-empty parent) (= startpos 0)) starttext : string := (:starttext delimarg) endtext : string := (:endtext delimarg) delimlistarg : delimlist := (:delimlist delimarg) startposchg : int := (if : int (then (= "" textarg) startpos) (then (= 0 startpos) 1) (else startpos)) delimlistcl : delimlist := (if : delimlist (is-empty close) delimlistarg (copy delimlistarg close)) delimfirst : delim := (delim-first<-string-delimlist textarg delimlistcl)] (if : textblock (then // init is-init (textblock-init textblockarg)) (then // empty parent (is-empty parent) textblockarg) (then // no delim found (is-empty delimfirst) (textblock-delimnotfound textblockarg)) (then // close delim (is-close delimfirst) (textblock<-close-textblock delimfirst textblockarg)) (then // single delim (is-single delimfirst) (textblock<-single-textblock delimfirst textblockarg)) (else // open delim (textblock<-open-textblock delimfirst textblockarg)))) :test (test (textblock :text "<a" :startpos 1 :endpos 2 :children (textblocklist (textblock :text "<a" :startpos 1 :endpos 2 :delim (copy delimbracketangle :delimlist vx/data/textblock/delimlisttest1) :children (textblocklist (textblock :text "a" :startpos 2 :endpos 2)) (msgblock (msg :code "closedelimmissing" :detail (delim :name "delimclose" :starttext ">") :severity 2)))) (msgblock (msg :code "closedelimmissing" :detail (delim :name "delimclose" :starttext ">") :severity 2))) (textblock-parse-one (textblock :text "a" :startpos 2 :endpos 2 :delim (delim :delimlist vx/data/textblock/delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<a" :startpos 1 :endpos 2 :delim (copy delimbracketangle :delimlist vx/data/textblock/delimlisttest1) :parent (textblock :text "<a" :startpos 1 :endpos 2))))) (test (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim delimtest1 :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) (textblock-parse-one (textblock :text "<{a,b},{c d}>" :delim delimtest1))) (test (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13))) (textblock-parse-one (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim delimtest1 :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))) (test (textblock :text "a,b},{c d}>" :startpos 3 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))) (textblock-parse-one (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13))))) (test (textblock :text "a" :startpos 3 :endpos 3 :parent (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0) :parent (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))))) (textblock-parse-one (textblock :text "a,b},{c d}>" :startpos 3 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))))) (test (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0) :parent (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3))))) (textblock-parse-one (textblock :text "a" :startpos 3 :endpos 3 :parent (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0) :parent (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)))))))) (test (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0))))) (textblock-parse-one (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0) :parent (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3))))))) (test (textblock :text "b" :startpos 5 :endpos 5 :parent (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)))))) (textblock-parse-one (textblock :text "b},{c d}>" :startpos 5 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{a,b},{c d}>" :startpos 2 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0))))))) (test (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5)))))) (textblock-parse-one (textblock :text "b" :startpos 5 :endpos 5 :parent (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13)) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)))))))) (test (textblock :startpos 7 :endpos 7 :parent (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0) :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5)))))))) (textblock-parse-one (textblock :text ",{c d}>" :startpos 7 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5)))))))) (test (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0) :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))))))) (textblock-parse-one (textblock :startpos 7 :endpos 7 :parent (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0) :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5)))))))))) (test (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0))))) (textblock-parse-one (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0) :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))))))))) (test (textblock :text "c d}>" :startpos 9 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))))) (textblock-parse-one (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0))))))) (test (textblock :text "c" :startpos 9 :endpos 9 :parent (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0) :parent (textblock :text "d}>" :startpos 11 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))))))) (textblock-parse-one (textblock :text "c d}>" :startpos 9 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))))))) (test (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0) :parent (textblock :text "d}>" :startpos 11 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9))))) (textblock-parse-one (textblock :text "c" :startpos 9 :endpos 9 :parent (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0) :parent (textblock :text "d}>" :startpos 11 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))))))))) (test (textblock :text "d}>" :startpos 11 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (delim :name "delimbracketangle" :starttext "<" :endtext ">" :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0))))) (textblock-parse-one (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0) :parent (textblock :text "d}>" :startpos 11 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9))))))) (test (textblock :text "d" :startpos 11 :endpos 11 :parent (textblock :text ">" :startpos 13 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)))))) (textblock-parse-one (textblock :text "d}>" :startpos 11 :endpos 13 :delim (delim :delimlist delimlisttest3) :close (copy delimclose :starttext "}") :parent (textblock :text "{c d}>" :startpos 8 :endpos 13 :delim (copy delimbracketcurly :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (delim :name "delimbracketangle" :starttext "<" :endtext ">" :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0))))))) (test (textblock :text ">" :startpos 13 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11)))))) (textblock-parse-one (textblock :text "d" :startpos 11 :endpos 11 :parent (textblock :text ">" :startpos 13 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)))) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)))))))) (test (textblock :startpos 13 :endpos 13 :parent (textblock :startpos 14 :endpos 14 :delim (delim :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))) (textblock-parse-one (textblock :text ">" :startpos 13 :endpos 13 :delim (delim :delimlist delimlisttest2) :close (copy delimclose :starttext ">") :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11)))))))) (test (textblock :startpos 14 :endpos 14 :delim (delim :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11)))))))) (textblock-parse-one (textblock :startpos 13 :endpos 13 :parent (textblock :startpos 14 :endpos 14 :delim (delim :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :close delimclosing :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))))) (test (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))) (textblock-parse-one (textblock :startpos 14 :endpos 14 :delim (delim :delimlist delimlisttest1) :parent (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11)))))))))) (test (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))) (textblock-parse-one (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :children (textblocklist (textblock :text "<{a,b},{c d}>" :startpos 1 :endpos 13 :delim (copy delimbracketangle :pos 0) :children (textblocklist (textblock :text "{a,b}" :startpos 2 :endpos 6 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "a" :startpos 3 :endpos 3) (textblock :text "," :startpos 4 :endpos 4 :delim (copy delimcomma :pos 0)) (textblock :text "b" :startpos 5 :endpos 5))) (textblock :text "," :startpos 7 :endpos 7 :delim (copy delimcomma :pos 0)) (textblock :text "{c d}" :startpos 8 :endpos 12 :delim (copy delimbracketcurly :pos 0) :children (textblocklist (textblock :text "c" :startpos 9 :endpos 9) (textblock :text " " :startpos 10 :endpos 10 :delim (copy delimwhitespace :pos 0)) (textblock :text "d" :startpos 11 :endpos 11))))))))) :doc "Returns a textblock that has been parse a single level.")
vx/data/textblock / textblock-replace<-textblock-find-replace
Description:
  • Replace the given parent textblock.
Function Name:
  • textblock-replace<-textblock-find-replace
Return Type:
  • vx/data/textblock/textblock
Arguments:
  • Name
    Type
    Generic
    Description
    textblockarg
    vx/data/textblock/textblock
    find
    vx/data/textblock/textblock
    replace
    vx/data/textblock/textblock
Usage/Test Cases:
Source Code:
  • (func textblock-replace<-textblock-find-replace : textblock [textblockarg : textblock find : textblock replace : textblock] (if : textblock (then // empty (is-empty textblockarg) (empty textblock)) (then // found (and (== find textblockarg)) replace) (else // recursion (copy textblockarg :parent (textblock-replace<-textblock-find-replace (:parent textblockarg) find replace)))) :doc "Replace the given parent textblock.")
vx/data/textblock / textblock-startleft<-string-delim-offset
Description:
  • Returns a textblock constructed from the text before the current delimiter start.
Function Name:
  • textblock-startleft<-string-delim-offset
Return Type:
  • vx/data/textblock/textblock
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    delim
    vx/data/textblock/delim
    offset
    vx/core/int
Usage/Test Cases:
  • (test (textblock :text "a" :startpos 1 :endpos 1) (textblock-startleft<-string-delim-offset "a,b" (delim :pos 2) 0))
Source Code:
  • (func textblock-startleft<-string-delim-offset : textblock [text : string delim : delim offset : int] (let [pos : int := (:pos delim) start : int := 1 end : int := (- pos 1)] (if (then (= "" text) (empty textblock)) (then (= 0 pos) (empty textblock)) (else (textblock :text (string<-string-start-end text start end) :startpos (+ offset start) :endpos (+ offset end) :curpos 0)))) :test (test (textblock :text "a" :startpos 1 :endpos 1) (textblock-startleft<-string-delim-offset "a,b" (delim :pos 2) 0)) :doc "Returns a textblock constructed from the text before the current delimiter start.")
vx/data/textblock / textblock-startright<-string-delim-offset
Description:
  • Returns a textblock constructed from the text after the current delimiter start.
Function Name:
  • textblock-startright<-string-delim-offset
Return Type:
  • vx/data/textblock/textblock
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    delimin
    vx/data/textblock/delim
    offset
    vx/core/int
Usage/Test Cases:
  • (test (textblock :text ",b" :startpos 2 :delim (copy delimcomma :pos 2)) (textblock-startright<-string-delim-offset "a,b" (copy delimcomma :pos 2) 0))
  • (test (textblock :text "<b>c" :startpos 2 :delim (copy delimbracketangle :pos 2 :delimlist (delimlist delimbracketcurly)) :close (copy delimclose :starttext ">")) (textblock-startright<-string-delim-offset "a<b>c" (copy delimbracketangle :pos 2 :delimlist (delimlist delimbracketcurly)) 0))
Source Code:
  • (func textblock-startright<-string-delim-offset : textblock [text : string delimin : delim offset : int] (let [startpos : int := (:pos delimin) starttext : string := (:starttext delimin) endtext : string := (:endtext delimin) delimlist : delimlist := (:delimlist delimin) close : delim := (if : delim (then (= endtext "") (empty delim)) (else (copy delimclose :starttext endtext))) delimlen : int := (switch : int starttext (case :nonwhitespace 0) (case :whitespace 0) (else (length<-string starttext))) curpos : int := 0] (if (then (= text "") (empty textblock)) (then (< startpos 0) (empty textblock)) (else (textblock :text (string<-string-start text startpos) :startpos (+ offset startpos) :curpos curpos :delim delimin :close close)))) :test (test (textblock :text ",b" :startpos 2 :delim (copy delimcomma :pos 2)) (textblock-startright<-string-delim-offset "a,b" (copy delimcomma :pos 2) 0)) (test (textblock :text "<b>c" :startpos 2 :delim (copy delimbracketangle :pos 2 :delimlist (delimlist delimbracketcurly)) :close (copy delimclose :starttext ">")) (textblock-startright<-string-delim-offset "a<b>c" (copy delimbracketangle :pos 2 :delimlist (delimlist delimbracketcurly)) 0)) :doc "Returns a textblock constructed from the text after the current delimiter start.")
vx/data/textblock / textblocklist<-textblocklist-remove
Description:
  • Return a textblocklist with all removedelims removed.
Function Name:
  • textblocklist<-textblocklist-remove
Return Type:
  • vx/data/textblock/textblocklist
Arguments:
  • Name
    Type
    Generic
    Description
    tblist
    vx/data/textblock/textblocklist
    remove
    vx/data/textblock/delim
Usage/Test Cases:
  • (test (textblocklist (textblock :text "+") (textblock :text "2") (textblock :text "3")) (textblocklist<-textblocklist-remove (textblocklist (textblock :text "+") (textblock :text " " :delim (copy delimwhitespace :pos 0)) (textblock :text "2") (textblock :text " " :delim (copy delimwhitespace :pos 0)) (textblock :text "3")) delimwhitespace))
Source Code:
  • (func textblocklist<-textblocklist-remove : textblocklist [tblist : textblocklist remove : delim] (list<-list-filter : textblocklist tblist (fn : textblock [textblock : textblock] (let : textblock [delimcurr : delim := (:delim textblock) namecurr : string := (:name delimcurr) nameremove : string := (:name remove)] (if (!= namecurr nameremove) textblock)))) :test (test (textblocklist (textblock :text "+") (textblock :text "2") (textblock :text "3")) (textblocklist<-textblocklist-remove (textblocklist (textblock :text "+") (textblock :text " " :delim (copy delimwhitespace :pos 0)) (textblock :text "2") (textblock :text " " :delim (copy delimwhitespace :pos 0)) (textblock :text "3")) delimwhitespace)) :doc "Return a textblocklist with all removedelims removed.")
vx/data/tree
Description:
  • General data tree
Package Name:
  • vx/data/tree
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
Types:
  • branch, brancharrow, branchlist, leaf, leaflist, tree
Constants:
  • brancharrow-up, brancharrow-down, brancharrow-updown
Functions:
Source Code:
  • (package vx/data/tree :doc "General data tree") (type branch : struct :properties [id : string brancharrow : brancharrow branchlist : branchlist leaflist : leaflist parentbranch : branch tree : tree]) (type brancharrow) (type branchlist : list :allowtypes [branch]) (type leaf : struct :properties [id : string name : string value : any]) (type leaflist : list :allowtypes [leaf]) (type tree : struct :properties [id : string name : string branch : branch]) (const brancharrow-up : brancharrow) (const brancharrow-down : brancharrow) (const brancharrow-updown : brancharrow)
vx/data/tree / branch
Description:
Type Name:
  • branch
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    id
    vx/core/string
    false
    false
    brancharrow
    vx/data/tree/brancharrow
    false
    false
    branchlist
    vx/data/tree/branchlist
    false
    false
    leaflist
    vx/data/tree/leaflist
    false
    false
    parentbranch
    vx/data/tree/branch
    false
    false
    tree
    vx/data/tree/tree
    false
    false
Usage/Test Cases:
Source Code:
  • (type branch : struct :properties [id : string brancharrow : brancharrow branchlist : branchlist leaflist : leaflist parentbranch : branch tree : tree])
vx/data/tree / brancharrow
Description:
Type Name:
  • brancharrow
Extends:
Default:
Usage/Test Cases:
Source Code:
  • (type brancharrow)
vx/data/tree / branchlist
Description:
Type Name:
  • branchlist
Extends:
  • :list
Default:
Allowed Types:
  • branch
Usage/Test Cases:
Source Code:
  • (type branchlist : list :allowtypes [branch])
vx/data/tree / leaf
Description:
Type Name:
  • leaf
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    id
    vx/core/string
    false
    false
    name
    vx/core/string
    false
    false
    value
    vx/core/any
    false
    false
Usage/Test Cases:
Source Code:
  • (type leaf : struct :properties [id : string name : string value : any])
vx/data/tree / leaflist
Description:
Type Name:
  • leaflist
Extends:
  • :list
Default:
Allowed Types:
  • leaf
Usage/Test Cases:
Source Code:
  • (type leaflist : list :allowtypes [leaf])
vx/data/tree / tree
Description:
Type Name:
  • tree
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    id
    vx/core/string
    false
    false
    name
    vx/core/string
    false
    false
    branch
    vx/data/tree/branch
    false
    false
Usage/Test Cases:
Source Code:
  • (type tree : struct :properties [id : string name : string branch : branch])
vx/data/tree / brancharrow-up
Description:
Constant Name:
  • brancharrow-up
Type:
  • vx/data/tree/brancharrow
Usage/Test Cases:
Source Code:
  • (const brancharrow-up : brancharrow)
vx/data/tree / brancharrow-down
Description:
Constant Name:
  • brancharrow-down
Type:
  • vx/data/tree/brancharrow
Usage/Test Cases:
Source Code:
  • (const brancharrow-down : brancharrow)
vx/data/tree / brancharrow-updown
Description:
Constant Name:
  • brancharrow-updown
Type:
  • vx/data/tree/brancharrow
Usage/Test Cases:
Source Code:
  • (const brancharrow-updown : brancharrow)
vx/data/xml
Description:
  • Xml handler
Package Name:
  • vx/data/xml
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    fil
    vx/data/file
    tb
    vx/data/textblock
    type
    vx/type
Types:
  • xml, xmllist, xmlpropmap
Constants:
  • delimxmlcdata, delimxmlcomment, delimxmlequal, delimxml
Functions:
  • string-first<-xml, textblock-xml<-string, xml<-file, xml<-string, xml<-textblock, xml-angle<-xml-textblock, xml-close<-xml-textblock, xml-parse<-xml-textblock, xml-parse<-xml-textblocklist, xml-property<-xml-textblock, xml-properties<-xml-textblocklist, xml-read<-file, xml-text<-xml-textblock
Source Code:
  • (package vx/data/xml :libs (lib fil :path vx/data/file) (lib tb :path vx/data/textblock) (lib type :path vx/type) :doc "Xml handler") (type xml : struct :properties [tag : string text : string prop : string propmap : stringmap children : xmllist parent : xml]) (type xmllist : list :allowtypes [xml]) (type xmlpropmap : map :allowtypes [string]) (const delimxmlcdata : tb/delim (delim :name "delimxmlcomment" :starttext "<![CDATA[" :endtext "]]>")) (const delimxmlcomment : tb/delim (delim :name "delimxmlcomment" :starttext "<!--" :endtext "-->")) (const delimxmlequal : tb/delim (delim :name "delimxmlequal" :starttext "=")) (const delimxml : tb/delim (tb/delim :delimlist (tb/delimlist delimxmlcomment delimxmlcdata (copy tb/delimbracketangle :delimlist (tb/delimlist delimxmlequal tb/delimwhitespace tb/delimquote))))) (func string-first<-xml : string [xml : xml] (let : string [children : xmllist := (:children xml) first : xml := (:1 children) text : string := (:text first) outdent : string := (type/string-outdent text) trim : string := (type/string-trim outdent)] trim) :test (test "text" (string-first<-xml (xml :children (xmllist (xml :text "text"))))) :doc "Returns string from first child's text.") (func textblock-xml<-string : tb/textblock [text : string] (tb/textblock-parse<-string-delim text delimxml) :test (test (tb/textblock :text "<doc> <tag1> <tag2 prop1=\"val1\" prop2=\"val2\" /> </tag1> </doc>" :startpos 1 :endpos 70 :children (tb/textblocklist (tb/textblock :text "<doc>" :startpos 1 :endpos 5 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "doc" :startpos 2 :endpos 4))) (tb/textblock :text "\n " :startpos 6 :endpos 8) (tb/textblock :text "<tag1>" :startpos 9 :endpos 14 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag1" :startpos 10 :endpos 13))) (tb/textblock :text "\n " :startpos 15 :endpos 19) (tb/textblock :text "<tag2 prop1=\"val1\" prop2=\"val2\" />" :startpos 20 :endpos 53 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag2" :startpos 21 :endpos 24) (tb/textblock :text " " :startpos 25 :endpos 25 :delim (copy tb/delimwhitespace :pos 0)) (textblock :text "prop1" :startpos 26 :endpos 30) (textblock :text "=" :startpos 31 :endpos 31 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val1\"" :startpos 32 :endpos 37 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val1" :startpos 33 :endpos 36))) (tb/textblock :text " " :startpos 38 :endpos 38 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop2" :startpos 39 :endpos 43) (textblock :text "=" :startpos 44 :endpos 44 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val2\"" :startpos 45 :endpos 50 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val2" :startpos 46 :endpos 49))) (tb/textblock :text " " :startpos 51 :endpos 51 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "/" :startpos 52 :endpos 52))) (tb/textblock :text "\n " :startpos 54 :endpos 56) (tb/textblock :text "</tag1>" :startpos 57 :endpos 63 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/tag1" :startpos 58 :endpos 62))) (tb/textblock :text "\n" :startpos 64 :endpos 64) (tb/textblock :text "</doc>" :startpos 65 :endpos 70 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/doc" :startpos 66 :endpos 69))))) (textblock-xml<-string "<doc> <tag1> <tag2 prop1=\"val1\" prop2=\"val2\" /> </tag1> </doc>")) :doc "Returns a parsed textblock from a string.") (func xml<-file : xml [file : fil/file] (let : xml [text : string := (:text file)] (xml<-string text)) :doc "Returns a parsed xml from a file.") (func xml<-string : xml [text : string] (xml<-textblock (textblock-xml<-string text)) :doc "Returns a parsed xml from a string.") (func xml<-textblock : xml [textblock : tb/textblock] (xml-parse<-xml-textblocklist (empty xml) (:children textblock)) :test (test (xml :tag "doc" :children (xmllist (xml :tag "tag1" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2")))))) (xml<-textblock (tb/textblock :text "<doc> <tag1> <tag2 prop1=\"val1\" prop2=\"val2\" /> </tag1> </doc>" :startpos 1 :endpos 70 :children (tb/textblocklist (tb/textblock :text "<doc>" :startpos 1 :endpos 5 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "doc" :startpos 2 :endpos 4))) (tb/textblock :text "\n " :startpos 6 :endpos 8 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "<tag1>" :startpos 9 :endpos 14 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag1" :startpos 10 :endpos 13))) (tb/textblock :text "\n " :startpos 15 :endpos 19 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "<tag2 prop1=\"val1\" prop2=\"val2\" />" :startpos 20 :endpos 53 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag2" :startpos 21 :endpos 24) (tb/textblock :text " " :startpos 25 :endpos 25 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop1" :startpos 26 :endpos 30) (tb/textblock :text "=" :startpos 31 :endpos 31 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val1\"" :startpos 32 :endpos 37 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val1" :startpos 33 :endpos 36))) (tb/textblock :text " " :startpos 38 :endpos 38 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop2" :startpos 39 :endpos 43) (tb/textblock :text "=" :startpos 44 :endpos 44 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val2\"" :startpos 45 :endpos 50 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val2" :startpos 46 :endpos 49))) (tb/textblock :text " " :startpos 51 :endpos 51 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "/" :startpos 52 :endpos 52))) (tb/textblock :text "\n " :startpos 54 :endpos 56 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "</tag1>" :startpos 57 :endpos 63 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/tag1" :startpos 58 :endpos 62))) (tb/textblock :text "\n" :startpos 64 :endpos 64 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "</doc>" :startpos 65 :endpos 70 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/doc" :startpos 66 :endpos 69))))))) :doc "Returns a parsed xml from a textblock.") (func xml-angle<-xml-textblock : xml [xmlarg : xml tb : tb/textblock] (if : xml (then // close tag (= (:text tb) (string "</" (:tag xmlarg) ">")) (xml-close<-xml-textblock xmlarg tb)) (else (let : xml [children : tb/textblocklist := (:children tb) xmlchg : xml := (xml :tag :notag :parent xmlarg)] (xml-properties<-xml-textblocklist xmlchg children)))) :test (test (xml :tag :notag) (xml-angle<-xml-textblock (empty xml) (empty tb/textblock))) (test (xml :tag "doc") (xml-angle<-xml-textblock (empty xml) (tb/textblock :text "<doc>" :startpos 1 :endpos 5 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "doc" :startpos 2 :endpos 4))))) (test (xml :tag "tag1" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2")))) (xml-angle<-xml-textblock (xml :tag "tag1") (tb/textblock :text "<tag2 prop1=\"val1\" prop2=\"val2\" />" :startpos 20 :endpos 53 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag2" :startpos 21 :endpos 24) (tb/textblock :text " " :startpos 25 :endpos 25 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop1" :startpos 26 :endpos 30) (tb/textblock :text "=" :startpos 31 :endpos 31 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val1\"" :startpos 32 :endpos 37 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val1" :startpos 33 :endpos 36))) (tb/textblock :text " " :startpos 38 :endpos 38 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop2" :startpos 39 :endpos 43) (tb/textblock :text "=" :startpos 44 :endpos 44 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val2\"" :startpos 45 :endpos 50 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val2" :startpos 46 :endpos 49))) (tb/textblock :text " " :startpos 51 :endpos 51 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "/" :startpos 52 :endpos 52))))) :doc "Returns a modified xml from a single textblock.") (func xml-close<-xml-textblock : xml [xmlarg : xml tb : tb/textblock] (let : xml [tag : string := (:tag xmlarg) text : string := (:text tb) parent : xml := (:parent xmlarg) isnoparent : boolean := (is-empty parent)] (if : xml (then // self close tag (or (= "/" text) (= text (string "</" tag ">"))) (if : xml (then isnoparent xmlarg) (else (copy parent :children (xmllist (:children parent) (copy xmlarg :parent (empty xml))))))) (else (copy xmlarg (msg<-error (string "Invalid Xml Close tag: " text)))))) :test (test (xml :tag "doc") (xml-close<-xml-textblock (xml :tag "doc") (tb/textblock :text "/"))) (test (xml :tag "doc") (xml-close<-xml-textblock (xml :tag "doc") (tb/textblock :text "</doc>"))) (test (xml :tag "doc" (msg :severity 2 :text "Invalid Xml Close tag: /wrong")) (xml-close<-xml-textblock (xml :tag "doc") (tb/textblock :text "/wrong"))) (test (xml :tag "top" :children (xmllist (xml :tag "doc"))) (xml-close<-xml-textblock (xml :tag "doc" :parent (xml :tag "top")) (tb/textblock :text "/"))) :doc "Returns a modified xml from a closing tag.") (func xml-parse<-xml-textblock : xml [xmlarg : xml tb : tb/textblock] (let : xml [delim : tb/delim := (:delim tb) text : string := (:text tb) starttext : string := (:starttext delim)] (switch : xml starttext (case "" (xml-text<-xml-textblock xmlarg tb)) (case (:starttext tb/delimbracketangle) (xml-angle<-xml-textblock xmlarg tb)) (case (:starttext tb/delimwhitespace) xmlarg) (case (:starttext delimxmlcomment) xmlarg) (case (:starttext delimxmlcdata) xmlarg))) :test (test (xml :tag "doc") (xml-parse<-xml-textblock (empty xml) (tb/textblock :text "<doc>" :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "doc"))))) (test (xml :tag "doc") (xml-parse<-xml-textblock (xml :tag "doc") (tb/textblock :text "\n " :delim (copy tb/delimwhitespace :pos 0)))) (test (xml :tag "tag1" :parent (xml :tag "doc")) (xml-parse<-xml-textblock (xml :tag "doc") (tb/textblock :text "<tag1>" :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag1"))))) (test (xml :tag "tag1" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2"))) :parent (xml :tag "doc")) (xml-parse<-xml-textblock (xml :tag "tag1" :parent (xml :tag "doc")) (tb/textblock :text "<tag2 prop1=\"val1\" prop2=\"val2\" />" :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop1") (tb/textblock :text "=" :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val1\"" :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val1"))) (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop2") (tb/textblock :text "=" :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val2\"" :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val2"))) (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "/"))))) (test (xml :tag "doc" :children (xmllist (xml :tag "tag1" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2")))))) (xml-parse<-xml-textblock (xml :tag "tag1" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2"))) :parent (xml :tag "doc")) (tb/textblock :text "</tag1>" :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/tag1"))))) /* (tb/textblock :text "</doc>" :startpos 65 :endpos 70 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/doc" :startpos 66 :endpos 69))))) (xml :tag "doc" :children (xmllist (xml :tag "tag1" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2")))))) */ :doc "Returns a modified xml from a single textblock.") (func xml-parse<-xml-textblocklist : xml [xmlarg : xml textblocklist : tb/textblocklist] (any<-list-start-reduce : xml textblocklist xmlarg (fn : xml [reduce : xml current : tb/textblock] (xml-parse<-xml-textblock reduce current))) :test (test (xml :tag "doc" :children (xmllist (xml :tag "tag1" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2")))))) (xml-parse<-xml-textblocklist (empty xml) (tb/textblocklist (tb/textblock :text "<doc>" :startpos 1 :endpos 5 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "doc" :startpos 2 :endpos 4))) (tb/textblock :text "\n " :startpos 6 :endpos 8 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "<tag1>" :startpos 9 :endpos 14 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag1" :startpos 10 :endpos 13))) (tb/textblock :text "\n " :startpos 15 :endpos 19 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "<tag2 prop1=\"val1\" prop2=\"val2\" />" :startpos 20 :endpos 53 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag2" :startpos 21 :endpos 24) (tb/textblock :text " " :startpos 25 :endpos 25 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop1" :startpos 26 :endpos 30) (tb/textblock :text "=" :startpos 31 :endpos 31 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val1\"" :startpos 32 :endpos 37 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val1" :startpos 33 :endpos 36))) (tb/textblock :text " " :startpos 38 :endpos 38 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop2" :startpos 39 :endpos 43) (tb/textblock :text "=" :startpos 44 :endpos 44 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val2\"" :startpos 45 :endpos 50 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val2" :startpos 46 :endpos 49))) (tb/textblock :text " " :startpos 51 :endpos 51 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "/" :startpos 52 :endpos 52))) (tb/textblock :text "\n " :startpos 54 :endpos 56 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "</tag1>" :startpos 57 :endpos 63 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/tag1" :startpos 58 :endpos 62))) (tb/textblock :text "\n" :startpos 64 :endpos 64 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "</doc>" :startpos 65 :endpos 70 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/doc" :startpos 66 :endpos 69)))))) :doc "Returns a modified xml from a textblocklist.") (func xml-property<-xml-textblock : xml [xmlarg : xml tbarg : tb/textblock] (let : xml [delim : tb/delim := (:delim tbarg) text : string := (:text tbarg) delimname : string := (:name delim) tag : string := (:tag xmlarg) prop : string := (:prop xmlarg) propmap : stringmap := (:propmap xmlarg)] (switch : xml delimname (case "" // plain text (if : xml (then (boolean<-string-starts text "/") (xml-close<-xml-textblock xmlarg tbarg)) (then (= ":notag" tag) (copy xmlarg :tag text)) (then (= "" prop) (copy xmlarg :prop text)))) (case "delimquote" (if : xml (= "" prop) (copy xmlarg (msg<-error "Found quoted text with no matching attribute.")) (copy xmlarg :prop "" :propmap (copy propmap prop (:text (:1 (:children tbarg))))))) (else xmlarg))) :test (test (xml :tag "tag1") (xml-property<-xml-textblock (xml :tag ":notag") (tb/textblock :text "tag1"))) (test (xml :tag "tag1" :prop "prop1") (xml-property<-xml-textblock (xml :tag "tag1") (tb/textblock :text "prop1"))) (test (xml :tag "tag1" :propmap (stringmap :prop1 "val1")) (xml-property<-xml-textblock (xml :tag "tag1" :prop "prop1") (tb/textblock :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val1"))))) :doc "Returns a modified xml from a single property.") (func xml-properties<-xml-textblocklist : xml [xmlarg : xml textblocklist : tb/textblocklist] (let : xml [xmlchg : xml := (any<-list-start-reduce : xml textblocklist xmlarg (fn : xml [reduce : xml current : tb/textblock] (xml-property<-xml-textblock reduce current)))] xmlchg) :test (test (xml :tag "doc" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2")))) (xml-properties<-xml-textblocklist (xml :tag :notag :parent (xml :tag "doc")) (tb/textblocklist (tb/textblock :text "tag2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop1") (tb/textblock :text "=" :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val1\"" :startpos 32 :endpos 37 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val1"))) (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop2") (tb/textblock :text "=" :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val2\"" :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val2"))) (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "/")))) :doc "Returns a modified xml from a textblocklist.") (func xml-read<-file : xml [file : fil/file] (let : xml [loaded : fil/file := (fil/file-read<-file file)] (xml<-file loaded)) :context :doc "Returns a parsed xml from a file.") (func xml-text<-xml-textblock : xml [xmlarg : xml tb : tb/textblock] (let : xml [text : string := (:text tb) xmlchg : xml := (xml :text text)] (if : xml (then // text node (is-empty xmlarg) xmlchg) (else // add text (copy xmlarg :children (xmllist (:children xmlarg) xmlchg))))) :test (test (xml :text "text1") (xml-text<-xml-textblock (empty xml) (tb/textblock :text "text1"))) (test (xml :tag "doc" :children (xmllist (xml :text "text1"))) (xml-text<-xml-textblock (xml :tag "doc") (tb/textblock :text "text1"))) :doc "Returns a modified xml from text.")
vx/data/xml / xml
Description:
Type Name:
  • xml
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    tag
    vx/core/string
    false
    false
    text
    vx/core/string
    false
    false
    prop
    vx/core/string
    false
    false
    propmap
    vx/core/stringmap
    false
    false
    children
    vx/data/xml/xmllist
    false
    false
    parent
    vx/data/xml/xml
    false
    false
Usage/Test Cases:
Source Code:
  • (type xml : struct :properties [tag : string text : string prop : string propmap : stringmap children : xmllist parent : xml])
vx/data/xml / xmllist
Description:
Type Name:
  • xmllist
Extends:
  • :list
Default:
Allowed Types:
  • xml
Usage/Test Cases:
Source Code:
  • (type xmllist : list :allowtypes [xml])
vx/data/xml / xmlpropmap
Description:
Type Name:
  • xmlpropmap
Extends:
  • :map
Default:
Allowed Types:
  • string
Usage/Test Cases:
Source Code:
  • (type xmlpropmap : map :allowtypes [string])
vx/data/xml / delimxmlcdata
Description:
Constant Name:
  • delimxmlcdata
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimxmlcdata : tb/delim (delim :name "delimxmlcomment" :starttext "<![CDATA[" :endtext "]]>"))
vx/data/xml / delimxmlcomment
Description:
Constant Name:
  • delimxmlcomment
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimxmlcomment : tb/delim (delim :name "delimxmlcomment" :starttext "<!--" :endtext "-->"))
vx/data/xml / delimxmlequal
Description:
Constant Name:
  • delimxmlequal
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimxmlequal : tb/delim (delim :name "delimxmlequal" :starttext "="))
vx/data/xml / delimxml
Description:
Constant Name:
  • delimxml
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimxml : tb/delim (tb/delim :delimlist (tb/delimlist delimxmlcomment delimxmlcdata (copy tb/delimbracketangle :delimlist (tb/delimlist delimxmlequal tb/delimwhitespace tb/delimquote)))))
vx/data/xml / string-first<-xml
Description:
  • Returns string from first child's text.
Function Name:
  • string-first<-xml
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
  • (test "text" (string-first<-xml (xml :children (xmllist (xml :text "text")))))
Source Code:
  • (func string-first<-xml : string [xml : xml] (let : string [children : xmllist := (:children xml) first : xml := (:1 children) text : string := (:text first) outdent : string := (type/string-outdent text) trim : string := (type/string-trim outdent)] trim) :test (test "text" (string-first<-xml (xml :children (xmllist (xml :text "text"))))) :doc "Returns string from first child's text.")
vx/data/xml / textblock-xml<-string
Description:
  • Returns a parsed textblock from a string.
Function Name:
  • textblock-xml<-string
Return Type:
  • vx/data/textblock/textblock
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
Usage/Test Cases:
  • (test (tb/textblock :text "<doc> <tag1> <tag2 prop1=\"val1\" prop2=\"val2\" /> </tag1> </doc>" :startpos 1 :endpos 70 :children (tb/textblocklist (tb/textblock :text "<doc>" :startpos 1 :endpos 5 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "doc" :startpos 2 :endpos 4))) (tb/textblock :text "\n " :startpos 6 :endpos 8) (tb/textblock :text "<tag1>" :startpos 9 :endpos 14 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag1" :startpos 10 :endpos 13))) (tb/textblock :text "\n " :startpos 15 :endpos 19) (tb/textblock :text "<tag2 prop1=\"val1\" prop2=\"val2\" />" :startpos 20 :endpos 53 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag2" :startpos 21 :endpos 24) (tb/textblock :text " " :startpos 25 :endpos 25 :delim (copy tb/delimwhitespace :pos 0)) (textblock :text "prop1" :startpos 26 :endpos 30) (textblock :text "=" :startpos 31 :endpos 31 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val1\"" :startpos 32 :endpos 37 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val1" :startpos 33 :endpos 36))) (tb/textblock :text " " :startpos 38 :endpos 38 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop2" :startpos 39 :endpos 43) (textblock :text "=" :startpos 44 :endpos 44 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val2\"" :startpos 45 :endpos 50 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val2" :startpos 46 :endpos 49))) (tb/textblock :text " " :startpos 51 :endpos 51 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "/" :startpos 52 :endpos 52))) (tb/textblock :text "\n " :startpos 54 :endpos 56) (tb/textblock :text "</tag1>" :startpos 57 :endpos 63 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/tag1" :startpos 58 :endpos 62))) (tb/textblock :text "\n" :startpos 64 :endpos 64) (tb/textblock :text "</doc>" :startpos 65 :endpos 70 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/doc" :startpos 66 :endpos 69))))) (textblock-xml<-string "<doc> <tag1> <tag2 prop1=\"val1\" prop2=\"val2\" /> </tag1> </doc>"))
Source Code:
  • (func textblock-xml<-string : tb/textblock [text : string] (tb/textblock-parse<-string-delim text delimxml) :test (test (tb/textblock :text "<doc> <tag1> <tag2 prop1=\"val1\" prop2=\"val2\" /> </tag1> </doc>" :startpos 1 :endpos 70 :children (tb/textblocklist (tb/textblock :text "<doc>" :startpos 1 :endpos 5 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "doc" :startpos 2 :endpos 4))) (tb/textblock :text "\n " :startpos 6 :endpos 8) (tb/textblock :text "<tag1>" :startpos 9 :endpos 14 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag1" :startpos 10 :endpos 13))) (tb/textblock :text "\n " :startpos 15 :endpos 19) (tb/textblock :text "<tag2 prop1=\"val1\" prop2=\"val2\" />" :startpos 20 :endpos 53 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag2" :startpos 21 :endpos 24) (tb/textblock :text " " :startpos 25 :endpos 25 :delim (copy tb/delimwhitespace :pos 0)) (textblock :text "prop1" :startpos 26 :endpos 30) (textblock :text "=" :startpos 31 :endpos 31 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val1\"" :startpos 32 :endpos 37 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val1" :startpos 33 :endpos 36))) (tb/textblock :text " " :startpos 38 :endpos 38 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop2" :startpos 39 :endpos 43) (textblock :text "=" :startpos 44 :endpos 44 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val2\"" :startpos 45 :endpos 50 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val2" :startpos 46 :endpos 49))) (tb/textblock :text " " :startpos 51 :endpos 51 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "/" :startpos 52 :endpos 52))) (tb/textblock :text "\n " :startpos 54 :endpos 56) (tb/textblock :text "</tag1>" :startpos 57 :endpos 63 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/tag1" :startpos 58 :endpos 62))) (tb/textblock :text "\n" :startpos 64 :endpos 64) (tb/textblock :text "</doc>" :startpos 65 :endpos 70 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/doc" :startpos 66 :endpos 69))))) (textblock-xml<-string "<doc> <tag1> <tag2 prop1=\"val1\" prop2=\"val2\" /> </tag1> </doc>")) :doc "Returns a parsed textblock from a string.")
vx/data/xml / xml<-file
Description:
  • Returns a parsed xml from a file.
Function Name:
  • xml<-file
Return Type:
  • vx/data/xml/xml
Arguments:
  • Name
    Type
    Generic
    Description
    file
    vx/data/file/file
Usage/Test Cases:
Source Code:
  • (func xml<-file : xml [file : fil/file] (let : xml [text : string := (:text file)] (xml<-string text)) :doc "Returns a parsed xml from a file.")
vx/data/xml / xml<-string
Description:
  • Returns a parsed xml from a string.
Function Name:
  • xml<-string
Return Type:
  • vx/data/xml/xml
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func xml<-string : xml [text : string] (xml<-textblock (textblock-xml<-string text)) :doc "Returns a parsed xml from a string.")
vx/data/xml / xml<-textblock
Description:
  • Returns a parsed xml from a textblock.
Function Name:
  • xml<-textblock
Return Type:
  • vx/data/xml/xml
Arguments:
  • Name
    Type
    Generic
    Description
    textblock
    vx/data/textblock/textblock
Usage/Test Cases:
  • (test (xml :tag "doc" :children (xmllist (xml :tag "tag1" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2")))))) (xml<-textblock (tb/textblock :text "<doc> <tag1> <tag2 prop1=\"val1\" prop2=\"val2\" /> </tag1> </doc>" :startpos 1 :endpos 70 :children (tb/textblocklist (tb/textblock :text "<doc>" :startpos 1 :endpos 5 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "doc" :startpos 2 :endpos 4))) (tb/textblock :text "\n " :startpos 6 :endpos 8 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "<tag1>" :startpos 9 :endpos 14 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag1" :startpos 10 :endpos 13))) (tb/textblock :text "\n " :startpos 15 :endpos 19 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "<tag2 prop1=\"val1\" prop2=\"val2\" />" :startpos 20 :endpos 53 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag2" :startpos 21 :endpos 24) (tb/textblock :text " " :startpos 25 :endpos 25 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop1" :startpos 26 :endpos 30) (tb/textblock :text "=" :startpos 31 :endpos 31 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val1\"" :startpos 32 :endpos 37 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val1" :startpos 33 :endpos 36))) (tb/textblock :text " " :startpos 38 :endpos 38 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop2" :startpos 39 :endpos 43) (tb/textblock :text "=" :startpos 44 :endpos 44 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val2\"" :startpos 45 :endpos 50 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val2" :startpos 46 :endpos 49))) (tb/textblock :text " " :startpos 51 :endpos 51 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "/" :startpos 52 :endpos 52))) (tb/textblock :text "\n " :startpos 54 :endpos 56 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "</tag1>" :startpos 57 :endpos 63 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/tag1" :startpos 58 :endpos 62))) (tb/textblock :text "\n" :startpos 64 :endpos 64 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "</doc>" :startpos 65 :endpos 70 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/doc" :startpos 66 :endpos 69)))))))
Source Code:
  • (func xml<-textblock : xml [textblock : tb/textblock] (xml-parse<-xml-textblocklist (empty xml) (:children textblock)) :test (test (xml :tag "doc" :children (xmllist (xml :tag "tag1" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2")))))) (xml<-textblock (tb/textblock :text "<doc> <tag1> <tag2 prop1=\"val1\" prop2=\"val2\" /> </tag1> </doc>" :startpos 1 :endpos 70 :children (tb/textblocklist (tb/textblock :text "<doc>" :startpos 1 :endpos 5 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "doc" :startpos 2 :endpos 4))) (tb/textblock :text "\n " :startpos 6 :endpos 8 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "<tag1>" :startpos 9 :endpos 14 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag1" :startpos 10 :endpos 13))) (tb/textblock :text "\n " :startpos 15 :endpos 19 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "<tag2 prop1=\"val1\" prop2=\"val2\" />" :startpos 20 :endpos 53 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag2" :startpos 21 :endpos 24) (tb/textblock :text " " :startpos 25 :endpos 25 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop1" :startpos 26 :endpos 30) (tb/textblock :text "=" :startpos 31 :endpos 31 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val1\"" :startpos 32 :endpos 37 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val1" :startpos 33 :endpos 36))) (tb/textblock :text " " :startpos 38 :endpos 38 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop2" :startpos 39 :endpos 43) (tb/textblock :text "=" :startpos 44 :endpos 44 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val2\"" :startpos 45 :endpos 50 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val2" :startpos 46 :endpos 49))) (tb/textblock :text " " :startpos 51 :endpos 51 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "/" :startpos 52 :endpos 52))) (tb/textblock :text "\n " :startpos 54 :endpos 56 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "</tag1>" :startpos 57 :endpos 63 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/tag1" :startpos 58 :endpos 62))) (tb/textblock :text "\n" :startpos 64 :endpos 64 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "</doc>" :startpos 65 :endpos 70 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/doc" :startpos 66 :endpos 69))))))) :doc "Returns a parsed xml from a textblock.")
vx/data/xml / xml-angle<-xml-textblock
Description:
  • Returns a modified xml from a single textblock.
Function Name:
  • xml-angle<-xml-textblock
Return Type:
  • vx/data/xml/xml
Arguments:
  • Name
    Type
    Generic
    Description
    xmlarg
    vx/data/xml/xml
    tb
    vx/data/textblock/textblock
Usage/Test Cases:
  • (test (xml :tag :notag) (xml-angle<-xml-textblock (empty xml) (empty tb/textblock)))
  • (test (xml :tag "doc") (xml-angle<-xml-textblock (empty xml) (tb/textblock :text "<doc>" :startpos 1 :endpos 5 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "doc" :startpos 2 :endpos 4)))))
  • (test (xml :tag "tag1" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2")))) (xml-angle<-xml-textblock (xml :tag "tag1") (tb/textblock :text "<tag2 prop1=\"val1\" prop2=\"val2\" />" :startpos 20 :endpos 53 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag2" :startpos 21 :endpos 24) (tb/textblock :text " " :startpos 25 :endpos 25 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop1" :startpos 26 :endpos 30) (tb/textblock :text "=" :startpos 31 :endpos 31 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val1\"" :startpos 32 :endpos 37 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val1" :startpos 33 :endpos 36))) (tb/textblock :text " " :startpos 38 :endpos 38 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop2" :startpos 39 :endpos 43) (tb/textblock :text "=" :startpos 44 :endpos 44 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val2\"" :startpos 45 :endpos 50 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val2" :startpos 46 :endpos 49))) (tb/textblock :text " " :startpos 51 :endpos 51 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "/" :startpos 52 :endpos 52)))))
Source Code:
  • (func xml-angle<-xml-textblock : xml [xmlarg : xml tb : tb/textblock] (if : xml (then // close tag (= (:text tb) (string "</" (:tag xmlarg) ">")) (xml-close<-xml-textblock xmlarg tb)) (else (let : xml [children : tb/textblocklist := (:children tb) xmlchg : xml := (xml :tag :notag :parent xmlarg)] (xml-properties<-xml-textblocklist xmlchg children)))) :test (test (xml :tag :notag) (xml-angle<-xml-textblock (empty xml) (empty tb/textblock))) (test (xml :tag "doc") (xml-angle<-xml-textblock (empty xml) (tb/textblock :text "<doc>" :startpos 1 :endpos 5 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "doc" :startpos 2 :endpos 4))))) (test (xml :tag "tag1" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2")))) (xml-angle<-xml-textblock (xml :tag "tag1") (tb/textblock :text "<tag2 prop1=\"val1\" prop2=\"val2\" />" :startpos 20 :endpos 53 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag2" :startpos 21 :endpos 24) (tb/textblock :text " " :startpos 25 :endpos 25 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop1" :startpos 26 :endpos 30) (tb/textblock :text "=" :startpos 31 :endpos 31 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val1\"" :startpos 32 :endpos 37 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val1" :startpos 33 :endpos 36))) (tb/textblock :text " " :startpos 38 :endpos 38 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop2" :startpos 39 :endpos 43) (tb/textblock :text "=" :startpos 44 :endpos 44 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val2\"" :startpos 45 :endpos 50 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val2" :startpos 46 :endpos 49))) (tb/textblock :text " " :startpos 51 :endpos 51 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "/" :startpos 52 :endpos 52))))) :doc "Returns a modified xml from a single textblock.")
vx/data/xml / xml-close<-xml-textblock
Description:
  • Returns a modified xml from a closing tag.
Function Name:
  • xml-close<-xml-textblock
Return Type:
  • vx/data/xml/xml
Arguments:
  • Name
    Type
    Generic
    Description
    xmlarg
    vx/data/xml/xml
    tb
    vx/data/textblock/textblock
Usage/Test Cases:
  • (test (xml :tag "doc") (xml-close<-xml-textblock (xml :tag "doc") (tb/textblock :text "/")))
  • (test (xml :tag "doc") (xml-close<-xml-textblock (xml :tag "doc") (tb/textblock :text "</doc>")))
  • (test (xml :tag "doc" (msg :severity 2 :text "Invalid Xml Close tag: /wrong")) (xml-close<-xml-textblock (xml :tag "doc") (tb/textblock :text "/wrong")))
  • (test (xml :tag "top" :children (xmllist (xml :tag "doc"))) (xml-close<-xml-textblock (xml :tag "doc" :parent (xml :tag "top")) (tb/textblock :text "/")))
Source Code:
  • (func xml-close<-xml-textblock : xml [xmlarg : xml tb : tb/textblock] (let : xml [tag : string := (:tag xmlarg) text : string := (:text tb) parent : xml := (:parent xmlarg) isnoparent : boolean := (is-empty parent)] (if : xml (then // self close tag (or (= "/" text) (= text (string "</" tag ">"))) (if : xml (then isnoparent xmlarg) (else (copy parent :children (xmllist (:children parent) (copy xmlarg :parent (empty xml))))))) (else (copy xmlarg (msg<-error (string "Invalid Xml Close tag: " text)))))) :test (test (xml :tag "doc") (xml-close<-xml-textblock (xml :tag "doc") (tb/textblock :text "/"))) (test (xml :tag "doc") (xml-close<-xml-textblock (xml :tag "doc") (tb/textblock :text "</doc>"))) (test (xml :tag "doc" (msg :severity 2 :text "Invalid Xml Close tag: /wrong")) (xml-close<-xml-textblock (xml :tag "doc") (tb/textblock :text "/wrong"))) (test (xml :tag "top" :children (xmllist (xml :tag "doc"))) (xml-close<-xml-textblock (xml :tag "doc" :parent (xml :tag "top")) (tb/textblock :text "/"))) :doc "Returns a modified xml from a closing tag.")
vx/data/xml / xml-parse<-xml-textblock
Description:
  • Returns a modified xml from a single textblock.
Function Name:
  • xml-parse<-xml-textblock
Return Type:
  • vx/data/xml/xml
Arguments:
  • Name
    Type
    Generic
    Description
    xmlarg
    vx/data/xml/xml
    tb
    vx/data/textblock/textblock
Usage/Test Cases:
  • (test (xml :tag "doc") (xml-parse<-xml-textblock (empty xml) (tb/textblock :text "<doc>" :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "doc")))))
  • (test (xml :tag "doc") (xml-parse<-xml-textblock (xml :tag "doc") (tb/textblock :text "\n " :delim (copy tb/delimwhitespace :pos 0))))
  • (test (xml :tag "tag1" :parent (xml :tag "doc")) (xml-parse<-xml-textblock (xml :tag "doc") (tb/textblock :text "<tag1>" :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag1")))))
  • (test (xml :tag "tag1" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2"))) :parent (xml :tag "doc")) (xml-parse<-xml-textblock (xml :tag "tag1" :parent (xml :tag "doc")) (tb/textblock :text "<tag2 prop1=\"val1\" prop2=\"val2\" />" :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop1") (tb/textblock :text "=" :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val1\"" :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val1"))) (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop2") (tb/textblock :text "=" :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val2\"" :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val2"))) (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "/")))))
  • (test (xml :tag "doc" :children (xmllist (xml :tag "tag1" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2")))))) (xml-parse<-xml-textblock (xml :tag "tag1" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2"))) :parent (xml :tag "doc")) (tb/textblock :text "</tag1>" :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/tag1")))))
Source Code:
  • (func xml-parse<-xml-textblock : xml [xmlarg : xml tb : tb/textblock] (let : xml [delim : tb/delim := (:delim tb) text : string := (:text tb) starttext : string := (:starttext delim)] (switch : xml starttext (case "" (xml-text<-xml-textblock xmlarg tb)) (case (:starttext tb/delimbracketangle) (xml-angle<-xml-textblock xmlarg tb)) (case (:starttext tb/delimwhitespace) xmlarg) (case (:starttext delimxmlcomment) xmlarg) (case (:starttext delimxmlcdata) xmlarg))) :test (test (xml :tag "doc") (xml-parse<-xml-textblock (empty xml) (tb/textblock :text "<doc>" :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "doc"))))) (test (xml :tag "doc") (xml-parse<-xml-textblock (xml :tag "doc") (tb/textblock :text "\n " :delim (copy tb/delimwhitespace :pos 0)))) (test (xml :tag "tag1" :parent (xml :tag "doc")) (xml-parse<-xml-textblock (xml :tag "doc") (tb/textblock :text "<tag1>" :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag1"))))) (test (xml :tag "tag1" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2"))) :parent (xml :tag "doc")) (xml-parse<-xml-textblock (xml :tag "tag1" :parent (xml :tag "doc")) (tb/textblock :text "<tag2 prop1=\"val1\" prop2=\"val2\" />" :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop1") (tb/textblock :text "=" :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val1\"" :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val1"))) (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop2") (tb/textblock :text "=" :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val2\"" :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val2"))) (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "/"))))) (test (xml :tag "doc" :children (xmllist (xml :tag "tag1" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2")))))) (xml-parse<-xml-textblock (xml :tag "tag1" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2"))) :parent (xml :tag "doc")) (tb/textblock :text "</tag1>" :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/tag1"))))) /* (tb/textblock :text "</doc>" :startpos 65 :endpos 70 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/doc" :startpos 66 :endpos 69))))) (xml :tag "doc" :children (xmllist (xml :tag "tag1" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2")))))) */ :doc "Returns a modified xml from a single textblock.")
vx/data/xml / xml-parse<-xml-textblocklist
Description:
  • Returns a modified xml from a textblocklist.
Function Name:
  • xml-parse<-xml-textblocklist
Return Type:
  • vx/data/xml/xml
Arguments:
  • Name
    Type
    Generic
    Description
    xmlarg
    vx/data/xml/xml
    textblocklist
    vx/data/textblock/textblocklist
Usage/Test Cases:
  • (test (xml :tag "doc" :children (xmllist (xml :tag "tag1" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2")))))) (xml-parse<-xml-textblocklist (empty xml) (tb/textblocklist (tb/textblock :text "<doc>" :startpos 1 :endpos 5 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "doc" :startpos 2 :endpos 4))) (tb/textblock :text "\n " :startpos 6 :endpos 8 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "<tag1>" :startpos 9 :endpos 14 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag1" :startpos 10 :endpos 13))) (tb/textblock :text "\n " :startpos 15 :endpos 19 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "<tag2 prop1=\"val1\" prop2=\"val2\" />" :startpos 20 :endpos 53 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag2" :startpos 21 :endpos 24) (tb/textblock :text " " :startpos 25 :endpos 25 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop1" :startpos 26 :endpos 30) (tb/textblock :text "=" :startpos 31 :endpos 31 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val1\"" :startpos 32 :endpos 37 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val1" :startpos 33 :endpos 36))) (tb/textblock :text " " :startpos 38 :endpos 38 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop2" :startpos 39 :endpos 43) (tb/textblock :text "=" :startpos 44 :endpos 44 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val2\"" :startpos 45 :endpos 50 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val2" :startpos 46 :endpos 49))) (tb/textblock :text " " :startpos 51 :endpos 51 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "/" :startpos 52 :endpos 52))) (tb/textblock :text "\n " :startpos 54 :endpos 56 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "</tag1>" :startpos 57 :endpos 63 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/tag1" :startpos 58 :endpos 62))) (tb/textblock :text "\n" :startpos 64 :endpos 64 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "</doc>" :startpos 65 :endpos 70 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/doc" :startpos 66 :endpos 69))))))
Source Code:
  • (func xml-parse<-xml-textblocklist : xml [xmlarg : xml textblocklist : tb/textblocklist] (any<-list-start-reduce : xml textblocklist xmlarg (fn : xml [reduce : xml current : tb/textblock] (xml-parse<-xml-textblock reduce current))) :test (test (xml :tag "doc" :children (xmllist (xml :tag "tag1" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2")))))) (xml-parse<-xml-textblocklist (empty xml) (tb/textblocklist (tb/textblock :text "<doc>" :startpos 1 :endpos 5 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "doc" :startpos 2 :endpos 4))) (tb/textblock :text "\n " :startpos 6 :endpos 8 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "<tag1>" :startpos 9 :endpos 14 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag1" :startpos 10 :endpos 13))) (tb/textblock :text "\n " :startpos 15 :endpos 19 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "<tag2 prop1=\"val1\" prop2=\"val2\" />" :startpos 20 :endpos 53 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "tag2" :startpos 21 :endpos 24) (tb/textblock :text " " :startpos 25 :endpos 25 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop1" :startpos 26 :endpos 30) (tb/textblock :text "=" :startpos 31 :endpos 31 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val1\"" :startpos 32 :endpos 37 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val1" :startpos 33 :endpos 36))) (tb/textblock :text " " :startpos 38 :endpos 38 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop2" :startpos 39 :endpos 43) (tb/textblock :text "=" :startpos 44 :endpos 44 :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val2\"" :startpos 45 :endpos 50 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val2" :startpos 46 :endpos 49))) (tb/textblock :text " " :startpos 51 :endpos 51 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "/" :startpos 52 :endpos 52))) (tb/textblock :text "\n " :startpos 54 :endpos 56 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "</tag1>" :startpos 57 :endpos 63 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/tag1" :startpos 58 :endpos 62))) (tb/textblock :text "\n" :startpos 64 :endpos 64 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "</doc>" :startpos 65 :endpos 70 :delim (copy tb/delimbracketangle :pos 0) :children (tb/textblocklist (tb/textblock :text "/doc" :startpos 66 :endpos 69)))))) :doc "Returns a modified xml from a textblocklist.")
vx/data/xml / xml-property<-xml-textblock
Description:
  • Returns a modified xml from a single property.
Function Name:
  • xml-property<-xml-textblock
Return Type:
  • vx/data/xml/xml
Arguments:
  • Name
    Type
    Generic
    Description
    xmlarg
    vx/data/xml/xml
    tbarg
    vx/data/textblock/textblock
Usage/Test Cases:
  • (test (xml :tag "tag1") (xml-property<-xml-textblock (xml :tag ":notag") (tb/textblock :text "tag1")))
  • (test (xml :tag "tag1" :prop "prop1") (xml-property<-xml-textblock (xml :tag "tag1") (tb/textblock :text "prop1")))
  • (test (xml :tag "tag1" :propmap (stringmap :prop1 "val1")) (xml-property<-xml-textblock (xml :tag "tag1" :prop "prop1") (tb/textblock :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val1")))))
Source Code:
  • (func xml-property<-xml-textblock : xml [xmlarg : xml tbarg : tb/textblock] (let : xml [delim : tb/delim := (:delim tbarg) text : string := (:text tbarg) delimname : string := (:name delim) tag : string := (:tag xmlarg) prop : string := (:prop xmlarg) propmap : stringmap := (:propmap xmlarg)] (switch : xml delimname (case "" // plain text (if : xml (then (boolean<-string-starts text "/") (xml-close<-xml-textblock xmlarg tbarg)) (then (= ":notag" tag) (copy xmlarg :tag text)) (then (= "" prop) (copy xmlarg :prop text)))) (case "delimquote" (if : xml (= "" prop) (copy xmlarg (msg<-error "Found quoted text with no matching attribute.")) (copy xmlarg :prop "" :propmap (copy propmap prop (:text (:1 (:children tbarg))))))) (else xmlarg))) :test (test (xml :tag "tag1") (xml-property<-xml-textblock (xml :tag ":notag") (tb/textblock :text "tag1"))) (test (xml :tag "tag1" :prop "prop1") (xml-property<-xml-textblock (xml :tag "tag1") (tb/textblock :text "prop1"))) (test (xml :tag "tag1" :propmap (stringmap :prop1 "val1")) (xml-property<-xml-textblock (xml :tag "tag1" :prop "prop1") (tb/textblock :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val1"))))) :doc "Returns a modified xml from a single property.")
vx/data/xml / xml-properties<-xml-textblocklist
Description:
  • Returns a modified xml from a textblocklist.
Function Name:
  • xml-properties<-xml-textblocklist
Return Type:
  • vx/data/xml/xml
Arguments:
  • Name
    Type
    Generic
    Description
    xmlarg
    vx/data/xml/xml
    textblocklist
    vx/data/textblock/textblocklist
Usage/Test Cases:
  • (test (xml :tag "doc" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2")))) (xml-properties<-xml-textblocklist (xml :tag :notag :parent (xml :tag "doc")) (tb/textblocklist (tb/textblock :text "tag2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop1") (tb/textblock :text "=" :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val1\"" :startpos 32 :endpos 37 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val1"))) (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop2") (tb/textblock :text "=" :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val2\"" :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val2"))) (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "/"))))
Source Code:
  • (func xml-properties<-xml-textblocklist : xml [xmlarg : xml textblocklist : tb/textblocklist] (let : xml [xmlchg : xml := (any<-list-start-reduce : xml textblocklist xmlarg (fn : xml [reduce : xml current : tb/textblock] (xml-property<-xml-textblock reduce current)))] xmlchg) :test (test (xml :tag "doc" :children (xmllist (xml :tag "tag2" :propmap (stringmap :prop1 "val1" :prop2 "val2")))) (xml-properties<-xml-textblocklist (xml :tag :notag :parent (xml :tag "doc")) (tb/textblocklist (tb/textblock :text "tag2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop1") (tb/textblock :text "=" :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val1\"" :startpos 32 :endpos 37 :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val1"))) (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "prop2") (tb/textblock :text "=" :delim (copy delimxmlequal :pos 0)) (tb/textblock :text "\"val2\"" :delim (copy tb/delimquote :pos 0) :children (tb/textblocklist (tb/textblock :text "val2"))) (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "/")))) :doc "Returns a modified xml from a textblocklist.")
vx/data/xml / xml-read<-file
Description:
  • Returns a parsed xml from a file.
Function Name:
  • xml-read<-file
Return Type:
  • vx/data/xml/xml
Arguments:
  • Name
    Type
    Generic
    Description
    file
    vx/data/file/file
Usage/Test Cases:
Source Code:
  • (func xml-read<-file : xml [file : fil/file] (let : xml [loaded : fil/file := (fil/file-read<-file file)] (xml<-file loaded)) :context :doc "Returns a parsed xml from a file.")
vx/data/xml / xml-text<-xml-textblock
Description:
  • Returns a modified xml from text.
Function Name:
  • xml-text<-xml-textblock
Return Type:
  • vx/data/xml/xml
Arguments:
  • Name
    Type
    Generic
    Description
    xmlarg
    vx/data/xml/xml
    tb
    vx/data/textblock/textblock
Usage/Test Cases:
  • (test (xml :text "text1") (xml-text<-xml-textblock (empty xml) (tb/textblock :text "text1")))
  • (test (xml :tag "doc" :children (xmllist (xml :text "text1"))) (xml-text<-xml-textblock (xml :tag "doc") (tb/textblock :text "text1")))
Source Code:
  • (func xml-text<-xml-textblock : xml [xmlarg : xml tb : tb/textblock] (let : xml [text : string := (:text tb) xmlchg : xml := (xml :text text)] (if : xml (then // text node (is-empty xmlarg) xmlchg) (else // add text (copy xmlarg :children (xmllist (:children xmlarg) xmlchg))))) :test (test (xml :text "text1") (xml-text<-xml-textblock (empty xml) (tb/textblock :text "text1"))) (test (xml :tag "doc" :children (xmllist (xml :text "text1"))) (xml-text<-xml-textblock (xml :tag "doc") (tb/textblock :text "text1"))) :doc "Returns a modified xml from text.")
vx/event
Description:
  • Event Handling
Package Name:
  • vx/event
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
Types:
  • event
Constants:
  • event-click, event-move
Functions:
  • any<-from-to
Source Code:
  • (package vx/event :doc "Event Handling") (type event : struct :properties [name : string from : any to : any fn-any<-any : any<-any fn-any<-from-to : any<-from-to] :doc "Generic event") (const event-click : event (event :name ":click") :doc "Click Event") (const event-move : event (event :name ":move") :doc "Move Event") (func any<-from-to : any-1 [from : any to : any] :doc "From to handling function.")
vx/event / event
Description:
  • Generic event
Type Name:
  • event
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    name
    vx/core/string
    false
    false
    from
    vx/core/any
    false
    false
    to
    vx/core/any
    false
    false
    fn-any<-any
    vx/core/any<-any
    false
    false
    fn-any<-from-to
    vx/event/any<-from-to
    false
    false
Usage/Test Cases:
Source Code:
  • (type event : struct :properties [name : string from : any to : any fn-any<-any : any<-any fn-any<-from-to : any<-from-to] :doc "Generic event")
vx/event / event-click
Description:
  • Click Event
Constant Name:
  • event-click
Type:
  • vx/event/event
Usage/Test Cases:
Source Code:
  • (const event-click : event (event :name ":click") :doc "Click Event")
vx/event / event-move
Description:
  • Move Event
Constant Name:
  • event-move
Type:
  • vx/event/event
Usage/Test Cases:
Source Code:
  • (const event-move : event (event :name ":move") :doc "Move Event")
vx/event / any<-from-to
Description:
  • From to handling function.
Function Name:
  • any<-from-to
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    from
    vx/core/any
    to
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func any<-from-to : any-1 [from : any to : any] :doc "From to handling function.")
vx/repl
Description:
  • Read-Evaluate-Print-Loop processor.
Package Name:
  • vx/repl
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    coll
    vx/collection
    type
    vx/type
    tb
    vx/data/textblock
    javafuture
    java.util.concurrent.CompletableFuture
Types:
  • liblist, repl, replarglist, repllist
Constants:
  • delimvxlisp, delimvxlispbracket, delimvxlispparen
Functions:
  • any<-liblist-string, any<-macro, any<-repl, any<-script, any-repl<-functype-args, anylist<-repllist, replarglist<-replarglist-textblock-argmap, argmap<-textblock-argmap, const<-string, repl<-liblist-string, repl<-macro, repl<-script, repl<-string-argmap, repl<-textblock, repl<-textblock-argmap, repl-bracket<-textblock-argmap, repl-empty<-textblock-argmap, repl-paren<-textblock-argmap, repllist<-textblocklist-argmap, textblock<-script, typefunc<-string
Source Code:
  • (package vx/repl :libs (lib coll :path vx/collection) (lib type :path vx/type) (lib tb :path vx/data/textblock) (lib javafuture) :doc "Read-Evaluate-Print-Loop processor.") (type liblist : list :allowtypes [string] :doc "List of library names") (type repl : struct :properties [name : string type : any repllist : repllist async : boolean val : any doc : string] :doc "Repl structure") (type replarglist : struct :properties [key : string current : repl repllist : repllist] :doc "Builder for a repllist") (type repllist : list :allowtypes [repl] :doc "List of repl") (const delimvxlisp : delim (delim :name "delimvxlisp" :delimlist (delimlist delimvxlispparen delimcomment delimcommentblock)) :doc "vxlisp File Delimiters") (const delimvxlispbracket : delim (copy delimbracketsquare :name "delimvxlispbracketsquare" :delimlist (delimlist delimcomment delimcommentblock delimquote delimquoteblock delimwhitespace delimvxlispparen)) :doc "vxlisp Square Bracket Delimiters") (const delimvxlispparen : delim (copy delimparen :name "delimvxlispparen" :delimlist (delimlist delimcomment delimcommentblock delimquote delimquoteblock delimwhitespace delimvxlispbracket delimvxlispparen)) :doc "vxlisp Paren Delimiters") (func any<-liblist-string : any [liblist : liblist text : string :doc "Program to run"] (let : any [repl : repl := (repl<-liblist-string liblist text)] (any<-repl repl)) :context :doc "Run an arbitrary program in the REPL.") (func any<-macro : any-1 [anylist : anylist :...] (let : any-1 [repl : repl := (repl<-macro anylist) val : any := (any<-repl repl)] (any<-any : any-1 val)) :context :test (test 5 (any<-macro : int "(+ " (- 7 5) " 3)")) :doc "A function that joins any number of values into a string and then parses and evaluates it.") (func any<-repl : any [repl : repl] (let : any [val : any := (:val repl) repltype : any := (:type repl) repllist : repllist := (:repllist repl) args : anylist := (anylist<-repllist repllist)] (if (then (!-empty val) val) (then (is-func repltype) (any-repl<-functype-args repltype args)) (else (new repltype args)))) :context :test (test "HelloWorld" (any<-repl (repl :type string :repllist (repllist (repl :val "Hello") (repl :val "World") )))) (test 5 (any<-repl (repl :type + :repllist (repllist (repl :val 2) (repl :val 3))))) :doc "Run an arbitrary program in the REPL.") (func any<-script : any [script : string] (let : any [textblock : tb/textblock := (textblock<-script script) repl : repl := (repl<-textblock textblock)] (any<-repl repl)) /* :test (test 2 (any<-script "2")) (test infinity (any<-script "infinity")) */ :test (test 5 (any<-script "(+ 2 3)")) :context :sideeffects "Since any code can be run. This is unsafe by nature." :doc "Run an arbitrary script.") (func any-repl<-functype-args : any [type : any args : anylist] (native :cpp "vx_core::Type_replfunc replfunc = dynamic_cast<vx_core::Type_replfunc>(type); output = replfunc->vx_repl(args);" :js "const vxvalue = type['vx_value'] if (vxvalue != undefined) { const fn = vxvalue['fn'] if (fn != undefined) { output = fn(...args) } }" :java "if (type instanceof Core.Type_replfunc) { Core.Type_replfunc replfunc = (Core.Type_replfunc)type; output = replfunc.vx_repl(args); }") :doc "Returns any from a repl func and args.") (func anylist<-repllist : anylist [repllist : repllist] (list<-list : anylist repllist (fn : any [repl : repl] (any<-repl repl))) :context :doc "Run an arbitrary program in the REPL.") (func replarglist<-replarglist-textblock-argmap : replarglist [replargs : replarglist tb : tb/textblock argmap : argmap] (let : replarglist [key : string := (:key replargs) current : repl := (:current replargs) repllist : repllist := (:repllist replargs) currlist : repllist := (:repllist current) text : string := (:text textblock)] (if : replarglist (then (= key "") (if : replarglist (then (= text ":") (copy replargs :key text)) (then (= text ":=") (copy replargs :key text)) (then (= text ":doc") (copy replargs :key text)) (else // new arg (copy replargs :current (repl :name text) :repllist (copy repllist current))))) (then (= key ":") (copy replargs :key "" :current (copy current :type text))) (then (= key ":=") (copy replargs :key "" :current (copy current :repllist (copy currlist (repl<-textblock-argmap tb argmap))))) (then (= key ":doc") (copy replargs :key "" :current (copy current :doc text))) (else replargs))) :doc "Returns a modified replarglist from by applying a textblock") (func argmap<-textblock-argmap : argmap [textblock : tb/textblock argmap : argmap] (if : argmap (!= "delimbracketsquare" (:name (:delim textblock))) argmap argmap) :doc "Returns an argmap with parsed args from textblock added.") (func const<-string : any [text : string] (let : any [pkgpos : int := (int<-string-findlast text "/") pkgname : string := (if : string (= 0 pkgpos) "vx/core" (type/string<-string-end text (-1 pkgpos))) name : string := (if : string (= 0 pkgpos) text (type/string<-string-start text (+1 pkgpos))) pkg : package := (package-global<-name pkgname) constmap : constmap := (:constmap pkg) constval : any := (any<-map constmap name)] (if : any (!-empty constval) constval (empty any))) :test (test infinity (const<-string "infinity")) (test tb/delimcomma (const<-string "vx/data/textblock/delimcomma")) :doc "Returns a constant from a fully qualified name.") (func repl<-liblist-string : repl [liblist : liblist text : string :doc "Program to run"] :doc "Returns a repl from the given text.") (func repl<-macro : repl [anylist : anylist :...] (let : repl [textlist : stringlist := (list<-list : stringlist anylist (fn [item : any] : string (let : string [typ : any := (type<-any item)] (switch : string typ (case string (any<-any : string item)) (else (string<-any item)))))) script : string := (type/string<-stringlist-join textlist "") tb : tb/textblock := (textblock<-script script)] (repl<-textblock tb)) :context :test (test (repl :type vx/core/+ :repllist (repllist (repl :val 2) (repl :val 3))) (repl<-macro "(+ " (- 7 5) " 3)")) :doc "A function that joins any number of values into a string and then parses it.") (func repl<-script : repl [script : string] (let [textblock : tb/textblock := (textblock<-script script)] (repl<-textblock textblock)) :test (test (repl :val 2) (repl<-script "2")) (test (repl :val infinity) (repl<-script "infinity")) (test (repl :type +) (repl<-script "+")) (test (repl :type + :repllist (repllist (repl :val 2) (repl :val 3))) (repl<-script "(+ 2 3)")) :doc "Returns a parsed repl from a string") (func repl<-string-argmap : repl [text : string argmap : argmap] (if : repl (then // if starts and ends quote (and (type/boolean<-string-starts text quote) (type/boolean<-string-ends text quote)) (repl :val (type/string<-string-start-end text 2 -1))) (then // then if is int (is-int text) (repl :val (int<-string text))) (then // then if is float (is-float text) (repl :val (float<-string text))) (else (let : repl [arg : any := (any<-map argmap text)] (if : repl (then // if in argmap (!-empty arg) (repl :val arg)) (else (let : repl [cnst : any := (const<-string text)] (if : repl (then (!-empty cnst) (repl :val cnst)) (else (let : repl [typefunc : any := (typefunc<-string text)] (if : repl (then (!-empty typefunc) (repl :type typefunc)) (else // error (repl (msg<-error :repltypenotfound text))))))))))))) :test (test (repl :val "Hello") (repl<-string-argmap `"Hello"` (empty argmap))) (test (repl :val 2) (repl<-string-argmap "2" (empty argmap))) (test (repl :val 2.3) (repl<-string-argmap "2.3" (empty argmap))) (test (repl :val infinity) (repl<-string-argmap "infinity" (empty argmap))) (test (repl :val tb/delimcomma) (repl<-string-argmap "vx/data/textblock/delimcomma" (empty argmap))) (test (repl :type string) (repl<-string-argmap "string" (empty argmap))) (test (repl :type +) (repl<-string-argmap "+" (empty argmap))) :doc "Returns a function, type, const or primitive from given string.") (func repl<-textblock : repl [textblock : tb/textblock] (repl<-textblock-argmap textblock (empty argmap)) :test (test (repl :val 2) (repl<-textblock (tb/textblock :text "2"))) (test (repl :type +) (repl<-textblock (tb/textblock :text "+"))) (test (repl :type +) (repl<-textblock (tb/textblock :text "+"))) (test (repl :type + :repllist (repllist (repl :val 2) (repl :val 3))) (repl<-textblock (tb/textblock :text "(+ 2 3)" :delim (copy delimvxlispparen :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "+") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "3"))))) (test (repl :type + :repllist (repllist (repl :val 2) (repl :val 3))) (repl<-textblock (tb/textblock :text "(+ 2 3)" :children (tb/textblocklist (tb/textblock :text "(+ 2 3)" :delim (copy delimvxlispparen :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "+") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "3"))))))) :doc "Returns a repl from a parsed textblock") (func repl<-textblock-argmap : repl [textblock : tb/textblock argmap : argmap] (let : repl [delim : delim := (:delim textblock) starttext : string := (:starttext delim)] (switch : repl starttext (case "" (repl-empty<-textblock-argmap textblock argmap)) (case (:starttext tb/delimparen) (repl-paren<-textblock-argmap textblock argmap)) (case (:starttext tb/delimbracketsquare) (repl-bracket<-textblock-argmap textblock argmap)))) :test (test (repl :val 2) (repl<-textblock-argmap (tb/textblock :text "2") (empty argmap))) (test (repl :type +) (repl<-textblock-argmap (tb/textblock :text "+") (empty argmap))) (test (repl :type + :repllist (repllist (repl :val 2) (repl :val 3))) (repl<-textblock-argmap (tb/textblock :text "(+ 2 3)" :delim (copy delimvxlispparen :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "+") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "3"))) (empty argmap))) (test (repl :type + :repllist (repllist (repl :val 2) (repl :val 3))) (repl<-textblock-argmap (tb/textblock :text "(+ 2 3)" :children (tb/textblocklist (tb/textblock :text "(+ 2 3)" :delim (copy delimvxlispparen :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "+") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "3"))))) (empty argmap))) :doc "Returns a repl from a parsed textblock") (func repl-bracket<-textblock-argmap : repl [textblock : tb/textblock argmap : argmap] (repl) /* (let : repl [childlst : tb/textblocklist := (:children textblock) children : tb/textblocklist := (tb/textblocklist<-textblocklist-remove childlst tb/delimwhitespace) tbname : tb/textblock := (:1 children) sname : string := (:text tbname) tbtype : tb/textblock := (tb/textblock<-textblocklist-key children ":") tbvalue : tb/textblock := (tb/textblock<-textblocklist-key children ":=") tbdoc : tb/textblock := (tb/textblock<-textblocklist-key children ":doc") replarg : repl := (repl<-string-argmap "vx/core/arg" argmap) repls : repllist := (repllist replarg) replargs : repl := (repl<-string-argmap "vx/core/arglist" argmap)] (copy replargs :repllist repls)) :test (test (repl :type vx/core/+ :repllist (repllist (repl :val 2) (repl :val 3))) (repl-bracket<-textblock-argmap (tb/textblock :text "[val : int := (+ 2 3)]" :delim (copy delimvxlispbracket :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "val") (tb/textblock :text ":") (tb/textblock :text "int") (tb/textblock :text ":=") (tb/textblock :delim (copy delimvxlispparen :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "+") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "3"))))) (empty argmap)))*/ :doc "Returns a repl from a squarebracket parsed textblock") (func repl-empty<-textblock-argmap : repl [textblock : tb/textblock argmap : argmap] (let : repl [children : tb/textblocklist := (:children textblock) len : int := (length<-list children)] (switch : repl len (case 0 (repl<-string-argmap (:text textblock) argmap)) (case 1 (repl<-textblock-argmap (:1 children) argmap)) (else (repl (msg<-error "Empty delim cannot have more than one child."))))) :test (test (repl :val 2) (repl-empty<-textblock-argmap (tb/textblock :text "2") (empty argmap))) (test (repl :type +) (repl-empty<-textblock-argmap (tb/textblock :text "+") (empty argmap))) (test (repl :val 2) (repl-empty<-textblock-argmap (tb/textblock :text "1" :children (tb/textblocklist (tb/textblock :text "2"))) (empty argmap))) (test (repl (msg<-error "Empty delim cannot have more than one child.")) (repl-empty<-textblock-argmap (tb/textblock :text "1" :children (tb/textblocklist (tb/textblock :text "2") (tb/textblock :text "3"))) (empty argmap))) :doc "Returns a repl from an empty delim textblock") (func repl-paren<-textblock-argmap : repl [textblock : tb/textblock argmap : argmap] (let : repl [childlst : tb/textblocklist := (:children textblock) children : tb/textblocklist := (tb/textblocklist<-textblocklist-remove childlst tb/delimwhitespace) tbfunc : tb/textblock := (:1 children) sfunc : string := (:text tbfunc) replfunc : repl := (repl<-string-argmap sfunc argmap) typefunc : any := (:type replfunc) posarg : int := (switch : int typefunc (case vx/core/let 3) (case vx/core/fn 3) (else 2)) argmap2 : argmap := (switch : argmap typefunc (case vx/core/let (argmap<-textblock-argmap (:3 children) argmap)) (case vx/core/fn (argmap<-textblock-argmap (:3 children) argmap)) (else argmap)) tbargs : tb/textblocklist := (coll/list<-list-start children posarg) replargs : repllist := (repllist<-textblocklist-argmap tbargs argmap)] (copy replfunc :repllist replargs)) :test (test (repl :type vx/core/+ :repllist (repllist (repl :val 2) (repl :val 3))) (repl-paren<-textblock-argmap (tb/textblock :text "(+ 2 3)" :delim (copy delimvxlispparen :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "+") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "3"))) (empty argmap))) :doc "Returns a repl from a parsed textblock") (func repllist<-textblocklist-argmap : repllist [textblocklist : tb/textblocklist argmap : argmap] (list<-list : repllist textblocklist (fn : repl [textblock : tb/textblock] (repl<-textblock textblock))) :doc "Returns a repllist from a parsed textblocklist") (func textblock<-script : tb/textblock [script : string] (tb/textblock-parse<-string-delim script delimvxlisp) :test (test (tb/textblock :text "infinity" :startpos 1 :endpos 8 :children (tb/textblocklist (tb/textblock :text "infinity" :startpos 1 :endpos 8 :delim (delim :name "delimvxlisp")))) (textblock<-script "infinity")) (test (tb/textblock :text "(+ 2 3)" :startpos 1 :endpos 7 :children (tb/textblocklist (tb/textblock :text "(+ 2 3)" :startpos 1 :endpos 7 :delim (copy delimvxlispparen :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "+" :startpos 2 :endpos 2) (tb/textblock :text " " :startpos 3 :endpos 3 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "2" :startpos 4 :endpos 4) (tb/textblock :text " " :startpos 5 :endpos 5 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "3" :startpos 6 :endpos 6))))) (textblock<-script "(+ 2 3)")) :doc "Returns a parsed textblock from a string") (func typefunc<-string : any [text : string] (let : any [pkgpos : int := (int<-string-findlast text "/") pkgname : string := (if : string (= 0 pkgpos) "vx/core" (type/string<-string-end text (-1 pkgpos))) name : string := (if : string (= 0 pkgpos) text (type/string<-string-start text (+1 pkgpos))) pkg : package := (package-global<-name pkgname) typemap : typemap := (:typemap pkg) typeval : any := (any<-map typemap name)] (if : any (!-empty typeval) typeval (let : any [funcmap : funcmap := (:funcmap pkg) funcval : any := (any<-map funcmap name)] (if : any (!-empty funcval) funcval (empty any))))) :test (test string (typefunc<-string "string")) (test + (typefunc<-string "+")) :doc "Returns a type, or func from a fully qualified name.") /* (func any<-repl-async : any [repl : repl] (let-async : any [val : any := (:val repl) repltype : any := (:type repl) repllist : repllist := (:repllist repl) args : anylist := (anylist<-repllist repllist)] (if (then (!-empty val) val) (then (is-func repltype) (any-repl<-functype-args repltype args)) (else (new repltype args)))) :async :context :doc "Run an arbitrary program in the REPL.") (func any<-script-async : any [text : string] (let-async : any [textblock : tb/textblock := (textblock-repl<-string text) repl : repl := (repl<-textblock textblock)] (any<-repl-async repl)) :context :async :sideeffects "Since any code can be run. This is unsafe by nature." :doc "Run an arbitrary script asynchronously.") */
vx/repl / liblist
Description:
  • List of library names
Type Name:
  • liblist
Extends:
  • :list
Default:
Allowed Types:
  • string
Usage/Test Cases:
Source Code:
  • (type liblist : list :allowtypes [string] :doc "List of library names")
vx/repl / repl
Description:
  • Repl structure
Type Name:
  • repl
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    name
    vx/core/string
    false
    false
    type
    vx/core/any
    false
    false
    repllist
    vx/repl/repllist
    false
    false
    async
    vx/core/boolean
    false
    false
    val
    vx/core/any
    false
    false
    doc
    vx/core/string
    false
    false
Usage/Test Cases:
Source Code:
  • (type repl : struct :properties [name : string type : any repllist : repllist async : boolean val : any doc : string] :doc "Repl structure")
vx/repl / replarglist
Description:
  • Builder for a repllist
Type Name:
  • replarglist
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    key
    vx/core/string
    false
    false
    current
    vx/repl/repl
    false
    false
    repllist
    vx/repl/repllist
    false
    false
Usage/Test Cases:
Source Code:
  • (type replarglist : struct :properties [key : string current : repl repllist : repllist] :doc "Builder for a repllist")
vx/repl / repllist
Description:
  • List of repl
Type Name:
  • repllist
Extends:
  • :list
Default:
Allowed Types:
  • repl
Usage/Test Cases:
Source Code:
  • (type repllist : list :allowtypes [repl] :doc "List of repl")
vx/repl / delimvxlisp
Description:
  • vxlisp File Delimiters
Constant Name:
  • delimvxlisp
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimvxlisp : delim (delim :name "delimvxlisp" :delimlist (delimlist delimvxlispparen delimcomment delimcommentblock)) :doc "vxlisp File Delimiters")
vx/repl / delimvxlispbracket
Description:
  • vxlisp Square Bracket Delimiters
Constant Name:
  • delimvxlispbracket
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimvxlispbracket : delim (copy delimbracketsquare :name "delimvxlispbracketsquare" :delimlist (delimlist delimcomment delimcommentblock delimquote delimquoteblock delimwhitespace delimvxlispparen)) :doc "vxlisp Square Bracket Delimiters")
vx/repl / delimvxlispparen
Description:
  • vxlisp Paren Delimiters
Constant Name:
  • delimvxlispparen
Type:
  • vx/data/textblock/delim
Usage/Test Cases:
Source Code:
  • (const delimvxlispparen : delim (copy delimparen :name "delimvxlispparen" :delimlist (delimlist delimcomment delimcommentblock delimquote delimquoteblock delimwhitespace delimvxlispbracket delimvxlispparen)) :doc "vxlisp Paren Delimiters")
vx/repl / any<-liblist-string
Description:
  • Run an arbitrary program in the REPL.
Function Name:
  • any<-liblist-string
Return Type:
  • vx/core/any
Arguments:
  • Name
    Type
    Generic
    Description
    liblist
    vx/repl/liblist
    text
    vx/core/string
    Program to run
Usage/Test Cases:
Source Code:
  • (func any<-liblist-string : any [liblist : liblist text : string :doc "Program to run"] (let : any [repl : repl := (repl<-liblist-string liblist text)] (any<-repl repl)) :context :doc "Run an arbitrary program in the REPL.")
vx/repl / any<-macro
Description:
  • A function that joins any number of values into a string and then parses and evaluates it.
Function Name:
  • any<-macro
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    anylist
    vx/core/anylist
Usage/Test Cases:
  • (test 5 (any<-macro : int "(+ " (- 7 5) " 3)"))
Source Code:
  • (func any<-macro : any-1 [anylist : anylist :...] (let : any-1 [repl : repl := (repl<-macro anylist) val : any := (any<-repl repl)] (any<-any : any-1 val)) :context :test (test 5 (any<-macro : int "(+ " (- 7 5) " 3)")) :doc "A function that joins any number of values into a string and then parses and evaluates it.")
vx/repl / any<-repl
Description:
  • Run an arbitrary program in the REPL.
Function Name:
  • any<-repl
Return Type:
  • vx/core/any
Arguments:
  • Name
    Type
    Generic
    Description
    repl
    vx/repl/repl
Usage/Test Cases:
  • (test "HelloWorld" (any<-repl (repl :type string :repllist (repllist (repl :val "Hello") (repl :val "World") ))))
  • (test 5 (any<-repl (repl :type + :repllist (repllist (repl :val 2) (repl :val 3)))))
Source Code:
  • (func any<-repl : any [repl : repl] (let : any [val : any := (:val repl) repltype : any := (:type repl) repllist : repllist := (:repllist repl) args : anylist := (anylist<-repllist repllist)] (if (then (!-empty val) val) (then (is-func repltype) (any-repl<-functype-args repltype args)) (else (new repltype args)))) :context :test (test "HelloWorld" (any<-repl (repl :type string :repllist (repllist (repl :val "Hello") (repl :val "World") )))) (test 5 (any<-repl (repl :type + :repllist (repllist (repl :val 2) (repl :val 3))))) :doc "Run an arbitrary program in the REPL.")
vx/repl / any<-script
Description:
  • Run an arbitrary script.
Function Name:
  • any<-script
Return Type:
  • vx/core/any
Arguments:
  • Name
    Type
    Generic
    Description
    script
    vx/core/string
Usage/Test Cases:
  • (test 5 (any<-script "(+ 2 3)"))
Source Code:
  • (func any<-script : any [script : string] (let : any [textblock : tb/textblock := (textblock<-script script) repl : repl := (repl<-textblock textblock)] (any<-repl repl)) /* :test (test 2 (any<-script "2")) (test infinity (any<-script "infinity")) */ :test (test 5 (any<-script "(+ 2 3)")) :context :sideeffects "Since any code can be run. This is unsafe by nature." :doc "Run an arbitrary script.")
vx/repl / any-repl<-functype-args
Description:
  • Returns any from a repl func and args.
Function Name:
  • any-repl<-functype-args
Return Type:
  • vx/core/any
Arguments:
  • Name
    Type
    Generic
    Description
    type
    vx/core/any
    args
    vx/core/anylist
Usage/Test Cases:
Source Code:
  • (func any-repl<-functype-args : any [type : any args : anylist] (native :cpp "vx_core::Type_replfunc replfunc = dynamic_cast<vx_core::Type_replfunc>(type); output = replfunc->vx_repl(args);" :js "const vxvalue = type['vx_value'] if (vxvalue != undefined) { const fn = vxvalue['fn'] if (fn != undefined) { output = fn(...args) } }" :java "if (type instanceof Core.Type_replfunc) { Core.Type_replfunc replfunc = (Core.Type_replfunc)type; output = replfunc.vx_repl(args); }") :doc "Returns any from a repl func and args.")
vx/repl / anylist<-repllist
Description:
  • Run an arbitrary program in the REPL.
Function Name:
  • anylist<-repllist
Return Type:
  • vx/core/anylist
Arguments:
  • Name
    Type
    Generic
    Description
    repllist
    vx/repl/repllist
Usage/Test Cases:
Source Code:
  • (func anylist<-repllist : anylist [repllist : repllist] (list<-list : anylist repllist (fn : any [repl : repl] (any<-repl repl))) :context :doc "Run an arbitrary program in the REPL.")
vx/repl / replarglist<-replarglist-textblock-argmap
Description:
  • Returns a modified replarglist from by applying a textblock
Function Name:
  • replarglist<-replarglist-textblock-argmap
Return Type:
  • vx/repl/replarglist
Arguments:
  • Name
    Type
    Generic
    Description
    replargs
    vx/repl/replarglist
    tb
    vx/data/textblock/textblock
    argmap
    vx/core/argmap
Usage/Test Cases:
Source Code:
  • (func replarglist<-replarglist-textblock-argmap : replarglist [replargs : replarglist tb : tb/textblock argmap : argmap] (let : replarglist [key : string := (:key replargs) current : repl := (:current replargs) repllist : repllist := (:repllist replargs) currlist : repllist := (:repllist current) text : string := (:text textblock)] (if : replarglist (then (= key "") (if : replarglist (then (= text ":") (copy replargs :key text)) (then (= text ":=") (copy replargs :key text)) (then (= text ":doc") (copy replargs :key text)) (else // new arg (copy replargs :current (repl :name text) :repllist (copy repllist current))))) (then (= key ":") (copy replargs :key "" :current (copy current :type text))) (then (= key ":=") (copy replargs :key "" :current (copy current :repllist (copy currlist (repl<-textblock-argmap tb argmap))))) (then (= key ":doc") (copy replargs :key "" :current (copy current :doc text))) (else replargs))) :doc "Returns a modified replarglist from by applying a textblock")
vx/repl / argmap<-textblock-argmap
Description:
  • Returns an argmap with parsed args from textblock added.
Function Name:
  • argmap<-textblock-argmap
Return Type:
  • vx/core/argmap
Arguments:
  • Name
    Type
    Generic
    Description
    textblock
    vx/data/textblock/textblock
    argmap
    vx/core/argmap
Usage/Test Cases:
Source Code:
  • (func argmap<-textblock-argmap : argmap [textblock : tb/textblock argmap : argmap] (if : argmap (!= "delimbracketsquare" (:name (:delim textblock))) argmap argmap) :doc "Returns an argmap with parsed args from textblock added.")
vx/repl / const<-string
Description:
  • Returns a constant from a fully qualified name.
Function Name:
  • const<-string
Return Type:
  • vx/core/any
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
Usage/Test Cases:
  • (test infinity (const<-string "infinity"))
  • (test tb/delimcomma (const<-string "vx/data/textblock/delimcomma"))
Source Code:
  • (func const<-string : any [text : string] (let : any [pkgpos : int := (int<-string-findlast text "/") pkgname : string := (if : string (= 0 pkgpos) "vx/core" (type/string<-string-end text (-1 pkgpos))) name : string := (if : string (= 0 pkgpos) text (type/string<-string-start text (+1 pkgpos))) pkg : package := (package-global<-name pkgname) constmap : constmap := (:constmap pkg) constval : any := (any<-map constmap name)] (if : any (!-empty constval) constval (empty any))) :test (test infinity (const<-string "infinity")) (test tb/delimcomma (const<-string "vx/data/textblock/delimcomma")) :doc "Returns a constant from a fully qualified name.")
vx/repl / repl<-liblist-string
Description:
  • Returns a repl from the given text.
Function Name:
  • repl<-liblist-string
Return Type:
  • vx/repl/repl
Arguments:
  • Name
    Type
    Generic
    Description
    liblist
    vx/repl/liblist
    text
    vx/core/string
    Program to run
Usage/Test Cases:
Source Code:
  • (func repl<-liblist-string : repl [liblist : liblist text : string :doc "Program to run"] :doc "Returns a repl from the given text.")
vx/repl / repl<-macro
Description:
  • A function that joins any number of values into a string and then parses it.
Function Name:
  • repl<-macro
Return Type:
  • vx/repl/repl
Arguments:
  • Name
    Type
    Generic
    Description
    anylist
    vx/core/anylist
Usage/Test Cases:
  • (test (repl :type vx/core/+ :repllist (repllist (repl :val 2) (repl :val 3))) (repl<-macro "(+ " (- 7 5) " 3)"))
Source Code:
  • (func repl<-macro : repl [anylist : anylist :...] (let : repl [textlist : stringlist := (list<-list : stringlist anylist (fn [item : any] : string (let : string [typ : any := (type<-any item)] (switch : string typ (case string (any<-any : string item)) (else (string<-any item)))))) script : string := (type/string<-stringlist-join textlist "") tb : tb/textblock := (textblock<-script script)] (repl<-textblock tb)) :context :test (test (repl :type vx/core/+ :repllist (repllist (repl :val 2) (repl :val 3))) (repl<-macro "(+ " (- 7 5) " 3)")) :doc "A function that joins any number of values into a string and then parses it.")
vx/repl / repl<-script
Description:
  • Returns a parsed repl from a string
Function Name:
  • repl<-script
Return Type:
  • vx/repl/repl
Arguments:
  • Name
    Type
    Generic
    Description
    script
    vx/core/string
Usage/Test Cases:
  • (test (repl :val 2) (repl<-script "2"))
  • (test (repl :val infinity) (repl<-script "infinity"))
  • (test (repl :type +) (repl<-script "+"))
  • (test (repl :type + :repllist (repllist (repl :val 2) (repl :val 3))) (repl<-script "(+ 2 3)"))
Source Code:
  • (func repl<-script : repl [script : string] (let [textblock : tb/textblock := (textblock<-script script)] (repl<-textblock textblock)) :test (test (repl :val 2) (repl<-script "2")) (test (repl :val infinity) (repl<-script "infinity")) (test (repl :type +) (repl<-script "+")) (test (repl :type + :repllist (repllist (repl :val 2) (repl :val 3))) (repl<-script "(+ 2 3)")) :doc "Returns a parsed repl from a string")
vx/repl / repl<-string-argmap
Description:
  • Returns a function, type, const or primitive from given string.
Function Name:
  • repl<-string-argmap
Return Type:
  • vx/repl/repl
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    argmap
    vx/core/argmap
Usage/Test Cases:
  • (test (repl :val "Hello") (repl<-string-argmap `"Hello"` (empty argmap)))
  • (test (repl :val 2) (repl<-string-argmap "2" (empty argmap)))
  • (test (repl :val 2.3) (repl<-string-argmap "2.3" (empty argmap)))
  • (test (repl :val infinity) (repl<-string-argmap "infinity" (empty argmap)))
  • (test (repl :val tb/delimcomma) (repl<-string-argmap "vx/data/textblock/delimcomma" (empty argmap)))
  • (test (repl :type string) (repl<-string-argmap "string" (empty argmap)))
  • (test (repl :type +) (repl<-string-argmap "+" (empty argmap)))
Source Code:
  • (func repl<-string-argmap : repl [text : string argmap : argmap] (if : repl (then // if starts and ends quote (and (type/boolean<-string-starts text quote) (type/boolean<-string-ends text quote)) (repl :val (type/string<-string-start-end text 2 -1))) (then // then if is int (is-int text) (repl :val (int<-string text))) (then // then if is float (is-float text) (repl :val (float<-string text))) (else (let : repl [arg : any := (any<-map argmap text)] (if : repl (then // if in argmap (!-empty arg) (repl :val arg)) (else (let : repl [cnst : any := (const<-string text)] (if : repl (then (!-empty cnst) (repl :val cnst)) (else (let : repl [typefunc : any := (typefunc<-string text)] (if : repl (then (!-empty typefunc) (repl :type typefunc)) (else // error (repl (msg<-error :repltypenotfound text))))))))))))) :test (test (repl :val "Hello") (repl<-string-argmap `"Hello"` (empty argmap))) (test (repl :val 2) (repl<-string-argmap "2" (empty argmap))) (test (repl :val 2.3) (repl<-string-argmap "2.3" (empty argmap))) (test (repl :val infinity) (repl<-string-argmap "infinity" (empty argmap))) (test (repl :val tb/delimcomma) (repl<-string-argmap "vx/data/textblock/delimcomma" (empty argmap))) (test (repl :type string) (repl<-string-argmap "string" (empty argmap))) (test (repl :type +) (repl<-string-argmap "+" (empty argmap))) :doc "Returns a function, type, const or primitive from given string.")
vx/repl / repl<-textblock
Description:
  • Returns a repl from a parsed textblock
Function Name:
  • repl<-textblock
Return Type:
  • vx/repl/repl
Arguments:
  • Name
    Type
    Generic
    Description
    textblock
    vx/data/textblock/textblock
Usage/Test Cases:
  • (test (repl :val 2) (repl<-textblock (tb/textblock :text "2")))
  • (test (repl :type +) (repl<-textblock (tb/textblock :text "+")))
  • (test (repl :type +) (repl<-textblock (tb/textblock :text "+")))
  • (test (repl :type + :repllist (repllist (repl :val 2) (repl :val 3))) (repl<-textblock (tb/textblock :text "(+ 2 3)" :delim (copy delimvxlispparen :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "+") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "3")))))
  • (test (repl :type + :repllist (repllist (repl :val 2) (repl :val 3))) (repl<-textblock (tb/textblock :text "(+ 2 3)" :children (tb/textblocklist (tb/textblock :text "(+ 2 3)" :delim (copy delimvxlispparen :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "+") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "3")))))))
Source Code:
  • (func repl<-textblock : repl [textblock : tb/textblock] (repl<-textblock-argmap textblock (empty argmap)) :test (test (repl :val 2) (repl<-textblock (tb/textblock :text "2"))) (test (repl :type +) (repl<-textblock (tb/textblock :text "+"))) (test (repl :type +) (repl<-textblock (tb/textblock :text "+"))) (test (repl :type + :repllist (repllist (repl :val 2) (repl :val 3))) (repl<-textblock (tb/textblock :text "(+ 2 3)" :delim (copy delimvxlispparen :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "+") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "3"))))) (test (repl :type + :repllist (repllist (repl :val 2) (repl :val 3))) (repl<-textblock (tb/textblock :text "(+ 2 3)" :children (tb/textblocklist (tb/textblock :text "(+ 2 3)" :delim (copy delimvxlispparen :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "+") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "3"))))))) :doc "Returns a repl from a parsed textblock")
vx/repl / repl<-textblock-argmap
Description:
  • Returns a repl from a parsed textblock
Function Name:
  • repl<-textblock-argmap
Return Type:
  • vx/repl/repl
Arguments:
  • Name
    Type
    Generic
    Description
    textblock
    vx/data/textblock/textblock
    argmap
    vx/core/argmap
Usage/Test Cases:
  • (test (repl :val 2) (repl<-textblock-argmap (tb/textblock :text "2") (empty argmap)))
  • (test (repl :type +) (repl<-textblock-argmap (tb/textblock :text "+") (empty argmap)))
  • (test (repl :type + :repllist (repllist (repl :val 2) (repl :val 3))) (repl<-textblock-argmap (tb/textblock :text "(+ 2 3)" :delim (copy delimvxlispparen :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "+") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "3"))) (empty argmap)))
  • (test (repl :type + :repllist (repllist (repl :val 2) (repl :val 3))) (repl<-textblock-argmap (tb/textblock :text "(+ 2 3)" :children (tb/textblocklist (tb/textblock :text "(+ 2 3)" :delim (copy delimvxlispparen :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "+") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "3"))))) (empty argmap)))
Source Code:
  • (func repl<-textblock-argmap : repl [textblock : tb/textblock argmap : argmap] (let : repl [delim : delim := (:delim textblock) starttext : string := (:starttext delim)] (switch : repl starttext (case "" (repl-empty<-textblock-argmap textblock argmap)) (case (:starttext tb/delimparen) (repl-paren<-textblock-argmap textblock argmap)) (case (:starttext tb/delimbracketsquare) (repl-bracket<-textblock-argmap textblock argmap)))) :test (test (repl :val 2) (repl<-textblock-argmap (tb/textblock :text "2") (empty argmap))) (test (repl :type +) (repl<-textblock-argmap (tb/textblock :text "+") (empty argmap))) (test (repl :type + :repllist (repllist (repl :val 2) (repl :val 3))) (repl<-textblock-argmap (tb/textblock :text "(+ 2 3)" :delim (copy delimvxlispparen :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "+") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "3"))) (empty argmap))) (test (repl :type + :repllist (repllist (repl :val 2) (repl :val 3))) (repl<-textblock-argmap (tb/textblock :text "(+ 2 3)" :children (tb/textblocklist (tb/textblock :text "(+ 2 3)" :delim (copy delimvxlispparen :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "+") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "3"))))) (empty argmap))) :doc "Returns a repl from a parsed textblock")
vx/repl / repl-bracket<-textblock-argmap
Description:
  • Returns a repl from a squarebracket parsed textblock
Function Name:
  • repl-bracket<-textblock-argmap
Return Type:
  • vx/repl/repl
Arguments:
  • Name
    Type
    Generic
    Description
    textblock
    vx/data/textblock/textblock
    argmap
    vx/core/argmap
Usage/Test Cases:
Source Code:
  • (func repl-bracket<-textblock-argmap : repl [textblock : tb/textblock argmap : argmap] (repl) /* (let : repl [childlst : tb/textblocklist := (:children textblock) children : tb/textblocklist := (tb/textblocklist<-textblocklist-remove childlst tb/delimwhitespace) tbname : tb/textblock := (:1 children) sname : string := (:text tbname) tbtype : tb/textblock := (tb/textblock<-textblocklist-key children ":") tbvalue : tb/textblock := (tb/textblock<-textblocklist-key children ":=") tbdoc : tb/textblock := (tb/textblock<-textblocklist-key children ":doc") replarg : repl := (repl<-string-argmap "vx/core/arg" argmap) repls : repllist := (repllist replarg) replargs : repl := (repl<-string-argmap "vx/core/arglist" argmap)] (copy replargs :repllist repls)) :test (test (repl :type vx/core/+ :repllist (repllist (repl :val 2) (repl :val 3))) (repl-bracket<-textblock-argmap (tb/textblock :text "[val : int := (+ 2 3)]" :delim (copy delimvxlispbracket :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "val") (tb/textblock :text ":") (tb/textblock :text "int") (tb/textblock :text ":=") (tb/textblock :delim (copy delimvxlispparen :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "+") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "3"))))) (empty argmap)))*/ :doc "Returns a repl from a squarebracket parsed textblock")
vx/repl / repl-empty<-textblock-argmap
Description:
  • Returns a repl from an empty delim textblock
Function Name:
  • repl-empty<-textblock-argmap
Return Type:
  • vx/repl/repl
Arguments:
  • Name
    Type
    Generic
    Description
    textblock
    vx/data/textblock/textblock
    argmap
    vx/core/argmap
Usage/Test Cases:
  • (test (repl :val 2) (repl-empty<-textblock-argmap (tb/textblock :text "2") (empty argmap)))
  • (test (repl :type +) (repl-empty<-textblock-argmap (tb/textblock :text "+") (empty argmap)))
  • (test (repl :val 2) (repl-empty<-textblock-argmap (tb/textblock :text "1" :children (tb/textblocklist (tb/textblock :text "2"))) (empty argmap)))
  • (test (repl (msg<-error "Empty delim cannot have more than one child.")) (repl-empty<-textblock-argmap (tb/textblock :text "1" :children (tb/textblocklist (tb/textblock :text "2") (tb/textblock :text "3"))) (empty argmap)))
Source Code:
  • (func repl-empty<-textblock-argmap : repl [textblock : tb/textblock argmap : argmap] (let : repl [children : tb/textblocklist := (:children textblock) len : int := (length<-list children)] (switch : repl len (case 0 (repl<-string-argmap (:text textblock) argmap)) (case 1 (repl<-textblock-argmap (:1 children) argmap)) (else (repl (msg<-error "Empty delim cannot have more than one child."))))) :test (test (repl :val 2) (repl-empty<-textblock-argmap (tb/textblock :text "2") (empty argmap))) (test (repl :type +) (repl-empty<-textblock-argmap (tb/textblock :text "+") (empty argmap))) (test (repl :val 2) (repl-empty<-textblock-argmap (tb/textblock :text "1" :children (tb/textblocklist (tb/textblock :text "2"))) (empty argmap))) (test (repl (msg<-error "Empty delim cannot have more than one child.")) (repl-empty<-textblock-argmap (tb/textblock :text "1" :children (tb/textblocklist (tb/textblock :text "2") (tb/textblock :text "3"))) (empty argmap))) :doc "Returns a repl from an empty delim textblock")
vx/repl / repl-paren<-textblock-argmap
Description:
  • Returns a repl from a parsed textblock
Function Name:
  • repl-paren<-textblock-argmap
Return Type:
  • vx/repl/repl
Arguments:
  • Name
    Type
    Generic
    Description
    textblock
    vx/data/textblock/textblock
    argmap
    vx/core/argmap
Usage/Test Cases:
  • (test (repl :type vx/core/+ :repllist (repllist (repl :val 2) (repl :val 3))) (repl-paren<-textblock-argmap (tb/textblock :text "(+ 2 3)" :delim (copy delimvxlispparen :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "+") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "3"))) (empty argmap)))
Source Code:
  • (func repl-paren<-textblock-argmap : repl [textblock : tb/textblock argmap : argmap] (let : repl [childlst : tb/textblocklist := (:children textblock) children : tb/textblocklist := (tb/textblocklist<-textblocklist-remove childlst tb/delimwhitespace) tbfunc : tb/textblock := (:1 children) sfunc : string := (:text tbfunc) replfunc : repl := (repl<-string-argmap sfunc argmap) typefunc : any := (:type replfunc) posarg : int := (switch : int typefunc (case vx/core/let 3) (case vx/core/fn 3) (else 2)) argmap2 : argmap := (switch : argmap typefunc (case vx/core/let (argmap<-textblock-argmap (:3 children) argmap)) (case vx/core/fn (argmap<-textblock-argmap (:3 children) argmap)) (else argmap)) tbargs : tb/textblocklist := (coll/list<-list-start children posarg) replargs : repllist := (repllist<-textblocklist-argmap tbargs argmap)] (copy replfunc :repllist replargs)) :test (test (repl :type vx/core/+ :repllist (repllist (repl :val 2) (repl :val 3))) (repl-paren<-textblock-argmap (tb/textblock :text "(+ 2 3)" :delim (copy delimvxlispparen :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "+") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "2") (tb/textblock :text " " :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "3"))) (empty argmap))) :doc "Returns a repl from a parsed textblock")
vx/repl / repllist<-textblocklist-argmap
Description:
  • Returns a repllist from a parsed textblocklist
Function Name:
  • repllist<-textblocklist-argmap
Return Type:
  • vx/repl/repllist
Arguments:
  • Name
    Type
    Generic
    Description
    textblocklist
    vx/data/textblock/textblocklist
    argmap
    vx/core/argmap
Usage/Test Cases:
Source Code:
  • (func repllist<-textblocklist-argmap : repllist [textblocklist : tb/textblocklist argmap : argmap] (list<-list : repllist textblocklist (fn : repl [textblock : tb/textblock] (repl<-textblock textblock))) :doc "Returns a repllist from a parsed textblocklist")
vx/repl / textblock<-script
Description:
  • Returns a parsed textblock from a string
Function Name:
  • textblock<-script
Return Type:
  • vx/data/textblock/textblock
Arguments:
  • Name
    Type
    Generic
    Description
    script
    vx/core/string
Usage/Test Cases:
  • (test (tb/textblock :text "infinity" :startpos 1 :endpos 8 :children (tb/textblocklist (tb/textblock :text "infinity" :startpos 1 :endpos 8 :delim (delim :name "delimvxlisp")))) (textblock<-script "infinity"))
  • (test (tb/textblock :text "(+ 2 3)" :startpos 1 :endpos 7 :children (tb/textblocklist (tb/textblock :text "(+ 2 3)" :startpos 1 :endpos 7 :delim (copy delimvxlispparen :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "+" :startpos 2 :endpos 2) (tb/textblock :text " " :startpos 3 :endpos 3 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "2" :startpos 4 :endpos 4) (tb/textblock :text " " :startpos 5 :endpos 5 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "3" :startpos 6 :endpos 6))))) (textblock<-script "(+ 2 3)"))
Source Code:
  • (func textblock<-script : tb/textblock [script : string] (tb/textblock-parse<-string-delim script delimvxlisp) :test (test (tb/textblock :text "infinity" :startpos 1 :endpos 8 :children (tb/textblocklist (tb/textblock :text "infinity" :startpos 1 :endpos 8 :delim (delim :name "delimvxlisp")))) (textblock<-script "infinity")) (test (tb/textblock :text "(+ 2 3)" :startpos 1 :endpos 7 :children (tb/textblocklist (tb/textblock :text "(+ 2 3)" :startpos 1 :endpos 7 :delim (copy delimvxlispparen :delimlist (empty delimlist)) :children (tb/textblocklist (tb/textblock :text "+" :startpos 2 :endpos 2) (tb/textblock :text " " :startpos 3 :endpos 3 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "2" :startpos 4 :endpos 4) (tb/textblock :text " " :startpos 5 :endpos 5 :delim (copy tb/delimwhitespace :pos 0)) (tb/textblock :text "3" :startpos 6 :endpos 6))))) (textblock<-script "(+ 2 3)")) :doc "Returns a parsed textblock from a string")
vx/repl / typefunc<-string
Description:
  • Returns a type, or func from a fully qualified name.
Function Name:
  • typefunc<-string
Return Type:
  • vx/core/any
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
Usage/Test Cases:
  • (test string (typefunc<-string "string"))
  • (test + (typefunc<-string "+"))
Source Code:
  • (func typefunc<-string : any [text : string] (let : any [pkgpos : int := (int<-string-findlast text "/") pkgname : string := (if : string (= 0 pkgpos) "vx/core" (type/string<-string-end text (-1 pkgpos))) name : string := (if : string (= 0 pkgpos) text (type/string<-string-start text (+1 pkgpos))) pkg : package := (package-global<-name pkgname) typemap : typemap := (:typemap pkg) typeval : any := (any<-map typemap name)] (if : any (!-empty typeval) typeval (let : any [funcmap : funcmap := (:funcmap pkg) funcval : any := (any<-map funcmap name)] (if : any (!-empty funcval) funcval (empty any))))) :test (test string (typefunc<-string "string")) (test + (typefunc<-string "+")) :doc "Returns a type, or func from a fully qualified name.")
vx/sample
Description:
  • Sample VxLisp Code
Package Name:
  • vx/sample
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
Types:
  • mytype
Constants:
  • myconst
Functions:
  • main, myfunc
Source Code:
  • (package vx/sample :doc "Sample VxLisp Code") (type mytype : struct :properties [mynum : int :doc "mynum" mystr : string :doc "mystr"]) (const myconst : int 4 :doc "My Constant" :test (test myconst myconst)) (func main : none [] (myfunc 2)) (func myfunc : int [myarg : int :doc "My Arg"] (+ myconst myarg) :doc "My Function" :test (test 5 (myfunc 1)))
vx/sample / mytype
Description:
Type Name:
  • mytype
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    mynum
    vx/core/int
    mynum
    false
    false
    mystr
    vx/core/string
    mystr
    false
    false
Usage/Test Cases:
Source Code:
  • (type mytype : struct :properties [mynum : int :doc "mynum" mystr : string :doc "mystr"])
vx/sample / myconst
Description:
  • My Constant
Constant Name:
  • myconst
Type:
  • vx/core/int
Usage/Test Cases:
  • (test myconst myconst)
Source Code:
  • (const myconst : int 4 :doc "My Constant" :test (test myconst myconst))
vx/sample / main
Description:
Function Name:
  • main
Return Type:
  • vx/core/none
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func main : none [] (myfunc 2))
vx/sample / myfunc
Description:
  • My Function
Function Name:
  • myfunc
Return Type:
  • vx/core/int
Arguments:
  • Name
    Type
    Generic
    Description
    myarg
    vx/core/int
    My Arg
Usage/Test Cases:
  • (test 5 (myfunc 1))
Source Code:
  • (func myfunc : int [myarg : int :doc "My Arg"] (+ myconst myarg) :doc "My Function" :test (test 5 (myfunc 1)))
vx/state
Description:
  • State handler
Package Name:
  • vx/state
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
Types:
  • value-map
Constants:
Functions:
  • change, register
Source Code:
  • (package vx/state :doc "State handler") (type value-map : map :allowtypes [any]) (func change : boolean [valuemap : value-map] :doc "Changes the current state") (func register : boolean [listener : statelistener])
vx/state / value-map
Description:
Type Name:
  • value-map
Extends:
  • :map
Default:
Allowed Types:
  • any
Usage/Test Cases:
Source Code:
  • (type value-map : map :allowtypes [any])
vx/state / change
Description:
  • Changes the current state
Function Name:
  • change
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    valuemap
    vx/state/value-map
Usage/Test Cases:
Source Code:
  • (func change : boolean [valuemap : value-map] :doc "Changes the current state")
vx/state / register
Description:
Function Name:
  • register
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    listener
    vx/core/statelistener
Usage/Test Cases:
Source Code:
  • (func register : boolean [listener : statelistener])
vx/test
Description:
  • Test Suite builder
Package Name:
  • vx/test
Libraries:
  • Name
    Path
    vx/core
    vx/core
    file
    vx/data/file
    html
    vx/web/html
Types:
  • testcase, testcaselist, testcoveragedetail, testcoveragenums, testcoveragesummary, testdescribe, testdescribelist, testpackage, testpackagelist, testresult, testresultlist
Constants:
  • stylesheet-test
Functions:
  • context-test, div<-testcaselist, div<-testpackage, div<-testpackagelist, divchildlist<-testpackagelist, file-test, file-testnode, file-testhtml, html<-divtest, p<-passfail, p<-testcoveragenums, resolve-testcase, resolve-testcaselist, resolve-testdescribe, resolve-testdescribelist, resolve-testpackage, resolve-testpackagelist, resolve-testresult, security-test, test, test, test-false, test-false, test-gt, test-gt, test-ne, test-ne, test-string, test-string, test-true, test-true, tr<-testdescribe-casename, trlist<-testcase, trlist<-testcaselist
Source Code:
  • (package vx/test :libs (lib file :path vx/data/file) (lib html :path vx/web/html) :doc "Test Suite builder") (type testcase : struct :properties [passfail : boolean testpkg : string casename : string describelist : testdescribelist] :doc "Structure to describe a test case") (type testcaselist : list :allowtypes [testcase] :doc "List of test cases") (type testcoveragedetail : struct :properties [constmap : intmap funcmap : intmap testpkg : string typemap : intmap] :doc "Structure to describe a test coverage detail") (type testcoveragenums : struct :properties [pct : int testpkg : string tests : int total : int] :doc "Structure to describe a test coverage summary") (type testcoveragesummary : struct :properties [bigospacenums : testcoveragenums bigotimenums : testcoveragenums constnums : testcoveragenums docnums : testcoveragenums funcnums : testcoveragenums testpkg : string totalnums : testcoveragenums typenums : testcoveragenums] :doc "Structure to describe a test coverage summary") (type testdescribe : struct :properties [describename : string testpkg : string testresult : testresult] :doc "Structure to describe test results") (type testdescribelist : list :allowtypes [testdescribe] :doc "List of testdescribe") (type testpackage : struct :properties [caselist : testcaselist coveragedetail : testcoveragedetail coveragesummary : testcoveragesummary passfail : boolean testpkg : string] :doc "Structure to hold all tests for a package") (type testpackagelist : list :allowtypes [testpackage] :doc "List of testpackage") (type testresult : struct :properties [code : string passfail : boolean expected : any actual : any fn-actual : any<-func-async] :doc "Structure to hold test results") (type testresultlist : list :allowtypes [testresult] :doc "List of test results") (const stylesheet-test : stylesheet (stylesheet-loadmap (stylesheet :name "Test Suite" :styles (stylelist (style :name "body" :props (propmap "font-size" "0.9em" "font-family" "sans-serif")) (style :name "details summary" :props (propmap "cursor" "pointer" "display" "inline-flex" "gap" "10px")) (style :name "table" :props (propmap "vertical-align" "top" "border-collapse" "collapse" "margin" "25px 0" "min-width" "400px" "box-shadow" "0 0 20px rgba(0, 0, 0, 0.15)")) (style :name "thead tr" :props (propmap "background-color" "#009879" "color" "#ffffff" "text-align" "left")) (style :name "td" :props (propmap "padding" "10px 10px" "vertical-align" "top")) (style :name "tbody tr" :props (propmap "border-bottom" "1px solid #dddddd")) (style :name "tbody tr:nth-of-type(even)" :props (propmap "background-color" "#f3f3f3")) (style :name "tbody tr:last-of-type" :props (propmap "border-bottom" "2px solid #009879")) (style :name "tbody tr.active-row" :props (propmap "font-weight" "bold" "color" "#009879")) (style :name ".failflag" :props (propmap "background-color" "red" "color" "white" "padding-left" "4px" "padding-right" "4px" "padding-top" "1px" "padding-bottom" "1px")) (style :name ".passflag" :props (propmap "background-color" "green" "color" "white" "padding-left" "4px" "padding-right" "4px" "padding-top" "1px" "padding-bottom" "1px")) (style :name ".coveragenums" :props (propmap "width" "90px")) (style :name ".coveragepct" :props (propmap "text-align" "right")) (style :name ".coveragepctgreen" :props (propmap "background-color" "green" "color" "white" "text-align" "right")) (style :name ".coveragepctred" :props (propmap "background-color" "red" "color" "white" "text-align" "right")) (style :name ".pkgheader" :props (propmap "display" "inline-flex" "gap" "10px")) (style :name ".pkgname" :props (propmap "font-weight" "bold" "width" "180px")) (style :name ".preformatted" :props (propmap "display" "block" "unicode-bidi" "embed" "font-family" "monospace" "white-space" "pre")) ) ) ) :doc "The default Test Stylesheet") (func context-test : context [args : anylist :...] (context :session (session :user (user :security (security-test)))) :doc "Returns the default context for test case execution. Arguments come from the command line.") (func div<-testcaselist : div [testcaselist : testcaselist] (div (table :thead (thead (tr (td (p :text "Pass?")) (td (p :text "Name")) (td (p :text "Test")) (td (p :text "Expected")) (td (p :text "Actual")) )) :tbody (tbody (trlist<-testcaselist testcaselist)) ) ) :doc "") (func div<-testpackage : div [testpackage : testpackage] (let : div [testcoveragesummary : testcoveragesummary := (:coveragesummary testpackage) pkgname : string := (:testpkg testpackage) caselist : testcaselist := (:caselist testpackage) passfail : boolean := (:passfail testpackage) pkgnamestyle : style := (style<-stylesheet-name stylesheet-test ".pkgname") node : div := (div<-testcaselist caselist) nodes : divchildlist := (divchildlist node) p-passfail : p := (p<-passfail passfail) p-pkgname : p := (p :style pkgnamestyle :text pkgname) p-totalnums : p := (p<-testcoveragenums (:totalnums testcoveragesummary)) p-coveragenums : p := (p<-testcoveragenums (:typenums testcoveragesummary)) p-constnums : p := (p<-testcoveragenums (:constnums testcoveragesummary)) p-funcnums : p := (p<-testcoveragenums (:funcnums testcoveragesummary)) p-docnums : p := (p<-testcoveragenums (:docnums testcoveragesummary)) p-bigospacenums : p := (p<-testcoveragenums (:bigospacenums testcoveragesummary)) p-bigotimenums : p := (p<-testcoveragenums (:bigotimenums testcoveragesummary)) summary : divchildlist := (divchildlist p-passfail p-pkgname p-totalnums p-coveragenums p-constnums p-funcnums p-docnums p-bigospacenums p-bigotimenums) details : details := (details :summary summary :nodes nodes)] (div details) ) :doc "Retuns a div from a test package") (func div<-testpackagelist : div [testpackagelist : testpackagelist] (let : div [stylepassfail : style := (style<-stylesheet-name stylesheet-test ".passfail") stylepkgname : style := (style<-stylesheet-name stylesheet-test ".pkgname") stylepkgheader : style := (style<-stylesheet-name stylesheet-test ".pkgheader") stylecoveragenum : style := (style<-stylesheet-name stylesheet-test ".coveragenums")] (div (div :style stylepkgheader (p :style stylepassfail :text "Pass?") (p :style stylepkgname :text "Package Name") (p :style stylecoveragenum :text "Coverage") (p :style stylecoveragenum :text "(type)") (p :style stylecoveragenum :text "(const)") (p :style stylecoveragenum :text "(func)") (p :style stylecoveragenum :text ":doc") (p :style stylecoveragenum :text ":bigospace") (p :style stylecoveragenum :text ":bigotime") ) (div (divchildlist<-testpackagelist testpackagelist)) ) ) :doc "") (func divchildlist<-testpackagelist : divchildlist [testpackagelist : testpackagelist] (list<-list testpackagelist div<-testpackage) :doc "Returns a divlist from a testpackagelist.") (func file-test : file/file (file :name "testsuite.vxlisp" :path "src/test/resources") :test (test-true (boolean-exists<-file (file :name "testsuite.vxlisp" :path "src/test/resources"))) :clientserver :server :doc "Default file location for testsuite.vxlisp") (func file-testnode : file/file (file :name "testsuitenode.vxlisp" :path "src/test/resources") :test (test-true (boolean-exists<-file (file :name "testsuitenode.vxlisp" :path "src/test/resources"))) :clientserver :server :doc "Default file location for testsuitenode.vxlisp") (func file-testhtml : file/file (file :name "testsuite.html" :path "src/test/resources") :test (test-true (boolean-exists<-file (file :name "testsuite.html" :path "src/test/resources"))) :clientserver :server :doc "Default file location for testsuite.html") (func html<-divtest : html [divtest : div] (html :lang "en" :head (head (meta :charset "utf-8") (meta :name "viewport" :content "width=device-width, initial-scale=1.0") (title :text "Test Suite") stylesheet-test) :body (body (div (h1 "Test Suite")) divtest)) :doc "Returns html from test div") (func p<-passfail : p [passfail : boolean] (let [text : string := (if passfail "Pass" "Fail") stylename : string := (if passfail ".passflag" ".failflag") style : style := (style<-stylesheet-name stylesheet-test stylename)] (p :style style :text text)) :doc "Returns a <p> tag from a passfail boolean value") (func p<-testcoveragenums : p [nums : testcoveragenums] (p :style (style<-stylesheet-name stylesheet-test ".coveragenums") :text (string (:pct nums) "% " (:tests nums) "/" (:total nums))) :doc "Returns <p>tests / total (pct%)</p> from testcoveragenums") (func resolve-testcase : testcase :async [testcase : testcase] (let [describelist : testdescribelist := (:describelist testcase) resolvedlist : testdescribelist := (resolve-testdescribelist describelist) passfaillist : booleanlist := (list<-list : booleanlist resolvedlist (fn : boolean [testdescribe : testdescribe] (let : boolean [testresult : testresult := (:testresult testdescribe)] (:passfail testresult)))) passfail : boolean := (and passfaillist)] (copy testcase :passfail passfail :describelist resolvedlist)) :doc "Resolves a testcase") (func resolve-testcaselist : testcaselist :async [testcaselist : testcaselist] (list<-list-async testcaselist resolve-testcase) :doc "Resolves a testcaselist") (func resolve-testdescribe : testdescribe :async [testdescribe : testdescribe] (let [testresult : testresult := (:testresult testdescribe) resolved : testresult := (resolve-testresult testresult)] (copy testdescribe :testresult resolved)) :doc "Resolves a testdescribe") (func resolve-testdescribelist : testdescribelist :async [testdescribelist : testdescribelist] (list<-list-async testdescribelist resolve-testdescribe) :doc "Resolves a testdescribelist") (func resolve-testpackage : testpackage :async [testpackage : testpackage] (let [testcaselist : testcaselist := (:caselist testpackage) resolvedlist : testcaselist := (resolve-testcaselist testcaselist) passfaillist : booleanlist := (list<-list : booleanlist resolvedlist (fn : boolean [testcase : testcase] (:passfail testcase) ) ) passfail : boolean := (and passfaillist)] (copy testpackage :passfail passfail :caselist resolvedlist)) :doc "Resolves a testpackage") (func resolve-testpackagelist : testpackagelist :async [testpackagelist : testpackagelist] (list<-list-async testpackagelist resolve-testpackage) :doc "Resolves a testpackagelist") (func resolve-testresult : testresult :async [testresult : testresult] (let : testresult [fn-actual : any<-func-async := (:fn-actual testresult) expected : any := (:expected testresult) actual : any := (resolve-async fn-actual)] (if : testresult (then (is-empty fn-actual) testresult) (else (let : testresult [passfail : boolean := (= expected actual)] (copy testresult :passfail passfail :actual actual ) ) ) ) ) :doc "Resolves a testresult") (func security-test : security (security :allowfuncs (funclist file/boolean-write<-file-any file/boolean-write<-file-string file/file-read<-file file/string-read<-file)) :doc "Returns the default security for test case execution. Arguments come from the command line.") (func test : testresult [expected : any-1 actual : any-2] (testresult :code :eq :passfail (= expected actual) :expected expected :actual actual) :context :messages :doc "Test expected equal actual") (func test : testresult [expected : any fn-actual : any<-func-async] (testresult :code :eq :expected expected :fn-actual fn-actual) :context :messages :doc "Async Test expected equal actual") (func test-false : testresult [actual : any] (testresult :code :false :passfail (= false actual) :expected false :actual actual) :context :messages :doc "Test expected to be false") (func test-false : testresult [fn-actual : any<-func-async] (testresult :code :false :expected false :fn-actual fn-actual) :context :messages :doc "Async Test expected to be false") (func test-gt : testresult [expected : any actual : any] (testresult :code :gt :passfail (> expected actual) :expected expected :actual actual) :context :messages :doc "Test expected greater than actual") (func test-gt : testresult [expected : any fn-actual : any<-func-async] (testresult :code :gt :expected expected :fn-actual fn-actual) :context :messages :doc "Async Test expected greater than actual") (func test-ne : testresult [expected : any actual : any] (testresult :code :ne :passfail (!= expected actual) :expected expected :actual actual) :context :messages :doc "Test expected not equal actual") (func test-ne : testresult [expected : any fn-actual : any<-func-async] (testresult :code :ne :expected expected :fn-actual fn-actual) :context :messages :doc "Async Test expected not equal actual") (func test-string : testresult [expected : any actual : any] (testresult :passfail (= (string<-any expected) (string<-any actual)) :expected expected :actual actual) :context :messages :doc "Test that the string version of expected equal actual") (func test-string : testresult [expected : any fn-actual : any<-func-async] (testresult :code :string :expected expected :fn-actual fn-actual) :context :messages :doc "Async Test that the string version of expected equal actual") (func test-true : testresult [actual : any] (testresult :code :true :passfail (= true actual) :expected true :actual actual) :context :messages :doc "Test expected to be true") (func test-true : testresult [fn-actual : any<-func-async] (testresult :code :true :expected true :fn-actual fn-actual) :context :messages :doc "Async Test expected to be true") (func tr<-testdescribe-casename : tr [testdescribe : testdescribe casename : string] (let : tr [describename : string := (:describename testdescribe) result : testresult := (:testresult testdescribe) passfail : boolean := (:passfail result) expected : string := (string<-any (:expected result)) actual : string := (string<-any (:actual result)) prestyle : style := (style<-stylesheet-name stylesheet-test ".preformatted")] (tr (td (p<-passfail passfail)) (td (p :style prestyle :text casename)) (td (p :style prestyle :text describename)) (td (p :style prestyle :text expected)) (td (p :style prestyle :text actual)) ) ) :doc "Returns tr from a testdescribe") (func trlist<-testcase : trlist [testcase : testcase] (let : trlist [describelist : testdescribelist := (:describelist testcase) casename : string := (:casename testcase)] (list<-list : trlist describelist (fn : tr [testdescribe : testdescribe] (tr<-testdescribe-casename testdescribe casename)) ) ) :doc "") (func trlist<-testcaselist : trlist [testcaselist : testcaselist] (list-join<-list : trlist testcaselist trlist<-testcase) :doc "Returns a trlist from a testcaselist.")
vx/test / testcase
Description:
  • Structure to describe a test case
Type Name:
  • testcase
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    passfail
    vx/core/boolean
    false
    false
    testpkg
    vx/core/string
    false
    false
    casename
    vx/core/string
    false
    false
    describelist
    vx/test/testdescribelist
    false
    false
Usage/Test Cases:
Source Code:
  • (type testcase : struct :properties [passfail : boolean testpkg : string casename : string describelist : testdescribelist] :doc "Structure to describe a test case")
vx/test / testcaselist
Description:
  • List of test cases
Type Name:
  • testcaselist
Extends:
  • :list
Default:
Allowed Types:
  • testcase
Usage/Test Cases:
Source Code:
  • (type testcaselist : list :allowtypes [testcase] :doc "List of test cases")
vx/test / testcoveragedetail
Description:
  • Structure to describe a test coverage detail
Type Name:
  • testcoveragedetail
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    constmap
    vx/core/intmap
    false
    false
    funcmap
    vx/core/intmap
    false
    false
    testpkg
    vx/core/string
    false
    false
    typemap
    vx/core/intmap
    false
    false
Usage/Test Cases:
Source Code:
  • (type testcoveragedetail : struct :properties [constmap : intmap funcmap : intmap testpkg : string typemap : intmap] :doc "Structure to describe a test coverage detail")
vx/test / testcoveragenums
Description:
  • Structure to describe a test coverage summary
Type Name:
  • testcoveragenums
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    pct
    vx/core/int
    false
    false
    testpkg
    vx/core/string
    false
    false
    tests
    vx/core/int
    false
    false
    total
    vx/core/int
    false
    false
Usage/Test Cases:
Source Code:
  • (type testcoveragenums : struct :properties [pct : int testpkg : string tests : int total : int] :doc "Structure to describe a test coverage summary")
vx/test / testcoveragesummary
Description:
  • Structure to describe a test coverage summary
Type Name:
  • testcoveragesummary
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    bigospacenums
    vx/test/testcoveragenums
    false
    false
    bigotimenums
    vx/test/testcoveragenums
    false
    false
    constnums
    vx/test/testcoveragenums
    false
    false
    docnums
    vx/test/testcoveragenums
    false
    false
    funcnums
    vx/test/testcoveragenums
    false
    false
    testpkg
    vx/core/string
    false
    false
    totalnums
    vx/test/testcoveragenums
    false
    false
    typenums
    vx/test/testcoveragenums
    false
    false
Usage/Test Cases:
Source Code:
  • (type testcoveragesummary : struct :properties [bigospacenums : testcoveragenums bigotimenums : testcoveragenums constnums : testcoveragenums docnums : testcoveragenums funcnums : testcoveragenums testpkg : string totalnums : testcoveragenums typenums : testcoveragenums] :doc "Structure to describe a test coverage summary")
vx/test / testdescribe
Description:
  • Structure to describe test results
Type Name:
  • testdescribe
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    describename
    vx/core/string
    false
    false
    testpkg
    vx/core/string
    false
    false
    testresult
    vx/test/testresult
    false
    false
Usage/Test Cases:
Source Code:
  • (type testdescribe : struct :properties [describename : string testpkg : string testresult : testresult] :doc "Structure to describe test results")
vx/test / testdescribelist
Description:
  • List of testdescribe
Type Name:
  • testdescribelist
Extends:
  • :list
Default:
Allowed Types:
  • testdescribe
Usage/Test Cases:
Source Code:
  • (type testdescribelist : list :allowtypes [testdescribe] :doc "List of testdescribe")
vx/test / testpackage
Description:
  • Structure to hold all tests for a package
Type Name:
  • testpackage
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    caselist
    vx/test/testcaselist
    false
    false
    coveragedetail
    vx/test/testcoveragedetail
    false
    false
    coveragesummary
    vx/test/testcoveragesummary
    false
    false
    passfail
    vx/core/boolean
    false
    false
    testpkg
    vx/core/string
    false
    false
Usage/Test Cases:
Source Code:
  • (type testpackage : struct :properties [caselist : testcaselist coveragedetail : testcoveragedetail coveragesummary : testcoveragesummary passfail : boolean testpkg : string] :doc "Structure to hold all tests for a package")
vx/test / testpackagelist
Description:
  • List of testpackage
Type Name:
  • testpackagelist
Extends:
  • :list
Default:
Allowed Types:
  • testpackage
Usage/Test Cases:
Source Code:
  • (type testpackagelist : list :allowtypes [testpackage] :doc "List of testpackage")
vx/test / testresult
Description:
  • Structure to hold test results
Type Name:
  • testresult
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    code
    vx/core/string
    false
    false
    passfail
    vx/core/boolean
    false
    false
    expected
    vx/core/any
    false
    false
    actual
    vx/core/any
    false
    false
    fn-actual
    vx/core/any<-func-async
    false
    false
Usage/Test Cases:
Source Code:
  • (type testresult : struct :properties [code : string passfail : boolean expected : any actual : any fn-actual : any<-func-async] :doc "Structure to hold test results")
vx/test / testresultlist
Description:
  • List of test results
Type Name:
  • testresultlist
Extends:
  • :list
Default:
Allowed Types:
  • testresult
Usage/Test Cases:
Source Code:
  • (type testresultlist : list :allowtypes [testresult] :doc "List of test results")
vx/test / stylesheet-test
Description:
  • The default Test Stylesheet
Constant Name:
  • stylesheet-test
Type:
  • vx/web/html/stylesheet
Usage/Test Cases:
Source Code:
  • (const stylesheet-test : stylesheet (stylesheet-loadmap (stylesheet :name "Test Suite" :styles (stylelist (style :name "body" :props (propmap "font-size" "0.9em" "font-family" "sans-serif")) (style :name "details summary" :props (propmap "cursor" "pointer" "display" "inline-flex" "gap" "10px")) (style :name "table" :props (propmap "vertical-align" "top" "border-collapse" "collapse" "margin" "25px 0" "min-width" "400px" "box-shadow" "0 0 20px rgba(0, 0, 0, 0.15)")) (style :name "thead tr" :props (propmap "background-color" "#009879" "color" "#ffffff" "text-align" "left")) (style :name "td" :props (propmap "padding" "10px 10px" "vertical-align" "top")) (style :name "tbody tr" :props (propmap "border-bottom" "1px solid #dddddd")) (style :name "tbody tr:nth-of-type(even)" :props (propmap "background-color" "#f3f3f3")) (style :name "tbody tr:last-of-type" :props (propmap "border-bottom" "2px solid #009879")) (style :name "tbody tr.active-row" :props (propmap "font-weight" "bold" "color" "#009879")) (style :name ".failflag" :props (propmap "background-color" "red" "color" "white" "padding-left" "4px" "padding-right" "4px" "padding-top" "1px" "padding-bottom" "1px")) (style :name ".passflag" :props (propmap "background-color" "green" "color" "white" "padding-left" "4px" "padding-right" "4px" "padding-top" "1px" "padding-bottom" "1px")) (style :name ".coveragenums" :props (propmap "width" "90px")) (style :name ".coveragepct" :props (propmap "text-align" "right")) (style :name ".coveragepctgreen" :props (propmap "background-color" "green" "color" "white" "text-align" "right")) (style :name ".coveragepctred" :props (propmap "background-color" "red" "color" "white" "text-align" "right")) (style :name ".pkgheader" :props (propmap "display" "inline-flex" "gap" "10px")) (style :name ".pkgname" :props (propmap "font-weight" "bold" "width" "180px")) (style :name ".preformatted" :props (propmap "display" "block" "unicode-bidi" "embed" "font-family" "monospace" "white-space" "pre")) ) ) ) :doc "The default Test Stylesheet")
vx/test / context-test
Description:
  • Returns the default context for test case execution. Arguments come from the command line.
Function Name:
  • context-test
Return Type:
  • vx/core/context
Arguments:
  • Name
    Type
    Generic
    Description
    args
    vx/core/anylist
Usage/Test Cases:
Source Code:
  • (func context-test : context [args : anylist :...] (context :session (session :user (user :security (security-test)))) :doc "Returns the default context for test case execution. Arguments come from the command line.")
vx/test / div<-testcaselist
Description:
Function Name:
  • div<-testcaselist
Return Type:
  • vx/web/html/div
Arguments:
  • Name
    Type
    Generic
    Description
    testcaselist
    vx/test/testcaselist
Usage/Test Cases:
Source Code:
  • (func div<-testcaselist : div [testcaselist : testcaselist] (div (table :thead (thead (tr (td (p :text "Pass?")) (td (p :text "Name")) (td (p :text "Test")) (td (p :text "Expected")) (td (p :text "Actual")) )) :tbody (tbody (trlist<-testcaselist testcaselist)) ) ) :doc "")
vx/test / div<-testpackage
Description:
  • Retuns a div from a test package
Function Name:
  • div<-testpackage
Return Type:
  • vx/web/html/div
Arguments:
  • Name
    Type
    Generic
    Description
    testpackage
    vx/test/testpackage
Usage/Test Cases:
Source Code:
  • (func div<-testpackage : div [testpackage : testpackage] (let : div [testcoveragesummary : testcoveragesummary := (:coveragesummary testpackage) pkgname : string := (:testpkg testpackage) caselist : testcaselist := (:caselist testpackage) passfail : boolean := (:passfail testpackage) pkgnamestyle : style := (style<-stylesheet-name stylesheet-test ".pkgname") node : div := (div<-testcaselist caselist) nodes : divchildlist := (divchildlist node) p-passfail : p := (p<-passfail passfail) p-pkgname : p := (p :style pkgnamestyle :text pkgname) p-totalnums : p := (p<-testcoveragenums (:totalnums testcoveragesummary)) p-coveragenums : p := (p<-testcoveragenums (:typenums testcoveragesummary)) p-constnums : p := (p<-testcoveragenums (:constnums testcoveragesummary)) p-funcnums : p := (p<-testcoveragenums (:funcnums testcoveragesummary)) p-docnums : p := (p<-testcoveragenums (:docnums testcoveragesummary)) p-bigospacenums : p := (p<-testcoveragenums (:bigospacenums testcoveragesummary)) p-bigotimenums : p := (p<-testcoveragenums (:bigotimenums testcoveragesummary)) summary : divchildlist := (divchildlist p-passfail p-pkgname p-totalnums p-coveragenums p-constnums p-funcnums p-docnums p-bigospacenums p-bigotimenums) details : details := (details :summary summary :nodes nodes)] (div details) ) :doc "Retuns a div from a test package")
vx/test / div<-testpackagelist
Description:
Function Name:
  • div<-testpackagelist
Return Type:
  • vx/web/html/div
Arguments:
  • Name
    Type
    Generic
    Description
    testpackagelist
    vx/test/testpackagelist
Usage/Test Cases:
Source Code:
  • (func div<-testpackagelist : div [testpackagelist : testpackagelist] (let : div [stylepassfail : style := (style<-stylesheet-name stylesheet-test ".passfail") stylepkgname : style := (style<-stylesheet-name stylesheet-test ".pkgname") stylepkgheader : style := (style<-stylesheet-name stylesheet-test ".pkgheader") stylecoveragenum : style := (style<-stylesheet-name stylesheet-test ".coveragenums")] (div (div :style stylepkgheader (p :style stylepassfail :text "Pass?") (p :style stylepkgname :text "Package Name") (p :style stylecoveragenum :text "Coverage") (p :style stylecoveragenum :text "(type)") (p :style stylecoveragenum :text "(const)") (p :style stylecoveragenum :text "(func)") (p :style stylecoveragenum :text ":doc") (p :style stylecoveragenum :text ":bigospace") (p :style stylecoveragenum :text ":bigotime") ) (div (divchildlist<-testpackagelist testpackagelist)) ) ) :doc "")
vx/test / divchildlist<-testpackagelist
Description:
  • Returns a divlist from a testpackagelist.
Function Name:
  • divchildlist<-testpackagelist
Return Type:
  • vx/web/html/divchildlist
Arguments:
  • Name
    Type
    Generic
    Description
    testpackagelist
    vx/test/testpackagelist
Usage/Test Cases:
Source Code:
  • (func divchildlist<-testpackagelist : divchildlist [testpackagelist : testpackagelist] (list<-list testpackagelist div<-testpackage) :doc "Returns a divlist from a testpackagelist.")
vx/test / file-test
Description:
  • Default file location for testsuite.vxlisp
Function Name:
  • file-test
Return Type:
  • vx/data/file/file
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
  • (test-true (boolean-exists<-file (file :name "testsuite.vxlisp" :path "src/test/resources")))
Source Code:
  • (func file-test : file/file (file :name "testsuite.vxlisp" :path "src/test/resources") :test (test-true (boolean-exists<-file (file :name "testsuite.vxlisp" :path "src/test/resources"))) :clientserver :server :doc "Default file location for testsuite.vxlisp")
vx/test / file-testnode
Description:
  • Default file location for testsuitenode.vxlisp
Function Name:
  • file-testnode
Return Type:
  • vx/data/file/file
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
  • (test-true (boolean-exists<-file (file :name "testsuitenode.vxlisp" :path "src/test/resources")))
Source Code:
  • (func file-testnode : file/file (file :name "testsuitenode.vxlisp" :path "src/test/resources") :test (test-true (boolean-exists<-file (file :name "testsuitenode.vxlisp" :path "src/test/resources"))) :clientserver :server :doc "Default file location for testsuitenode.vxlisp")
vx/test / file-testhtml
Description:
  • Default file location for testsuite.html
Function Name:
  • file-testhtml
Return Type:
  • vx/data/file/file
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
  • (test-true (boolean-exists<-file (file :name "testsuite.html" :path "src/test/resources")))
Source Code:
  • (func file-testhtml : file/file (file :name "testsuite.html" :path "src/test/resources") :test (test-true (boolean-exists<-file (file :name "testsuite.html" :path "src/test/resources"))) :clientserver :server :doc "Default file location for testsuite.html")
vx/test / html<-divtest
Description:
  • Returns html from test div
Function Name:
  • html<-divtest
Return Type:
  • vx/web/html/html
Arguments:
  • Name
    Type
    Generic
    Description
    divtest
    vx/web/html/div
Usage/Test Cases:
Source Code:
  • (func html<-divtest : html [divtest : div] (html :lang "en" :head (head (meta :charset "utf-8") (meta :name "viewport" :content "width=device-width, initial-scale=1.0") (title :text "Test Suite") stylesheet-test) :body (body (div (h1 "Test Suite")) divtest)) :doc "Returns html from test div")
vx/test / p<-passfail
Description:
  • Returns a <p> tag from a passfail boolean value
Function Name:
  • p<-passfail
Return Type:
  • vx/web/html/p
Arguments:
  • Name
    Type
    Generic
    Description
    passfail
    vx/core/boolean
Usage/Test Cases:
Source Code:
  • (func p<-passfail : p [passfail : boolean] (let [text : string := (if passfail "Pass" "Fail") stylename : string := (if passfail ".passflag" ".failflag") style : style := (style<-stylesheet-name stylesheet-test stylename)] (p :style style :text text)) :doc "Returns a <p> tag from a passfail boolean value")
vx/test / p<-testcoveragenums
Description:
  • Returns <p>tests / total (pct%)</p> from testcoveragenums
Function Name:
  • p<-testcoveragenums
Return Type:
  • vx/web/html/p
Arguments:
  • Name
    Type
    Generic
    Description
    nums
    vx/test/testcoveragenums
Usage/Test Cases:
Source Code:
  • (func p<-testcoveragenums : p [nums : testcoveragenums] (p :style (style<-stylesheet-name stylesheet-test ".coveragenums") :text (string (:pct nums) "% " (:tests nums) "/" (:total nums))) :doc "Returns <p>tests / total (pct%)</p> from testcoveragenums")
vx/test / resolve-testcase
Description:
  • Resolves a testcase
Function Name:
  • resolve-testcase
Return Type:
  • vx/test/testcase
Arguments:
  • Name
    Type
    Generic
    Description
    testcase
    vx/test/testcase
Usage/Test Cases:
Source Code:
  • (func resolve-testcase : testcase :async [testcase : testcase] (let [describelist : testdescribelist := (:describelist testcase) resolvedlist : testdescribelist := (resolve-testdescribelist describelist) passfaillist : booleanlist := (list<-list : booleanlist resolvedlist (fn : boolean [testdescribe : testdescribe] (let : boolean [testresult : testresult := (:testresult testdescribe)] (:passfail testresult)))) passfail : boolean := (and passfaillist)] (copy testcase :passfail passfail :describelist resolvedlist)) :doc "Resolves a testcase")
vx/test / resolve-testcaselist
Description:
  • Resolves a testcaselist
Function Name:
  • resolve-testcaselist
Return Type:
  • vx/test/testcaselist
Arguments:
  • Name
    Type
    Generic
    Description
    testcaselist
    vx/test/testcaselist
Usage/Test Cases:
Source Code:
  • (func resolve-testcaselist : testcaselist :async [testcaselist : testcaselist] (list<-list-async testcaselist resolve-testcase) :doc "Resolves a testcaselist")
vx/test / resolve-testdescribe
Description:
  • Resolves a testdescribe
Function Name:
  • resolve-testdescribe
Return Type:
  • vx/test/testdescribe
Arguments:
  • Name
    Type
    Generic
    Description
    testdescribe
    vx/test/testdescribe
Usage/Test Cases:
Source Code:
  • (func resolve-testdescribe : testdescribe :async [testdescribe : testdescribe] (let [testresult : testresult := (:testresult testdescribe) resolved : testresult := (resolve-testresult testresult)] (copy testdescribe :testresult resolved)) :doc "Resolves a testdescribe")
vx/test / resolve-testdescribelist
Description:
  • Resolves a testdescribelist
Function Name:
  • resolve-testdescribelist
Return Type:
  • vx/test/testdescribelist
Arguments:
  • Name
    Type
    Generic
    Description
    testdescribelist
    vx/test/testdescribelist
Usage/Test Cases:
Source Code:
  • (func resolve-testdescribelist : testdescribelist :async [testdescribelist : testdescribelist] (list<-list-async testdescribelist resolve-testdescribe) :doc "Resolves a testdescribelist")
vx/test / resolve-testpackage
Description:
  • Resolves a testpackage
Function Name:
  • resolve-testpackage
Return Type:
  • vx/test/testpackage
Arguments:
  • Name
    Type
    Generic
    Description
    testpackage
    vx/test/testpackage
Usage/Test Cases:
Source Code:
  • (func resolve-testpackage : testpackage :async [testpackage : testpackage] (let [testcaselist : testcaselist := (:caselist testpackage) resolvedlist : testcaselist := (resolve-testcaselist testcaselist) passfaillist : booleanlist := (list<-list : booleanlist resolvedlist (fn : boolean [testcase : testcase] (:passfail testcase) ) ) passfail : boolean := (and passfaillist)] (copy testpackage :passfail passfail :caselist resolvedlist)) :doc "Resolves a testpackage")
vx/test / resolve-testpackagelist
Description:
  • Resolves a testpackagelist
Function Name:
  • resolve-testpackagelist
Return Type:
  • vx/test/testpackagelist
Arguments:
  • Name
    Type
    Generic
    Description
    testpackagelist
    vx/test/testpackagelist
Usage/Test Cases:
Source Code:
  • (func resolve-testpackagelist : testpackagelist :async [testpackagelist : testpackagelist] (list<-list-async testpackagelist resolve-testpackage) :doc "Resolves a testpackagelist")
vx/test / resolve-testresult
Description:
  • Resolves a testresult
Function Name:
  • resolve-testresult
Return Type:
  • vx/test/testresult
Arguments:
  • Name
    Type
    Generic
    Description
    testresult
    vx/test/testresult
Usage/Test Cases:
Source Code:
  • (func resolve-testresult : testresult :async [testresult : testresult] (let : testresult [fn-actual : any<-func-async := (:fn-actual testresult) expected : any := (:expected testresult) actual : any := (resolve-async fn-actual)] (if : testresult (then (is-empty fn-actual) testresult) (else (let : testresult [passfail : boolean := (= expected actual)] (copy testresult :passfail passfail :actual actual ) ) ) ) ) :doc "Resolves a testresult")
vx/test / security-test
Description:
  • Returns the default security for test case execution. Arguments come from the command line.
Function Name:
  • security-test
Return Type:
  • vx/core/security
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func security-test : security (security :allowfuncs (funclist file/boolean-write<-file-any file/boolean-write<-file-string file/file-read<-file file/string-read<-file)) :doc "Returns the default security for test case execution. Arguments come from the command line.")
vx/test / test
Description:
  • Test expected equal actual
Function Name:
  • test
Return Type:
  • vx/test/testresult
Arguments:
  • Name
    Type
    Generic
    Description
    expected
    vx/core/any-1
    actual
    vx/core/any-2
Usage/Test Cases:
Source Code:
  • (func test : testresult [expected : any-1 actual : any-2] (testresult :code :eq :passfail (= expected actual) :expected expected :actual actual) :context :messages :doc "Test expected equal actual")
vx/test / test
Description:
  • Async Test expected equal actual
Function Name:
  • test
Return Type:
  • vx/test/testresult
Arguments:
  • Name
    Type
    Generic
    Description
    expected
    vx/core/any
    fn-actual
    vx/core/any<-func-async
Usage/Test Cases:
Source Code:
  • (func test : testresult [expected : any fn-actual : any<-func-async] (testresult :code :eq :expected expected :fn-actual fn-actual) :context :messages :doc "Async Test expected equal actual")
vx/test / test-false
Description:
  • Test expected to be false
Function Name:
  • test-false
Return Type:
  • vx/test/testresult
Arguments:
  • Name
    Type
    Generic
    Description
    actual
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func test-false : testresult [actual : any] (testresult :code :false :passfail (= false actual) :expected false :actual actual) :context :messages :doc "Test expected to be false")
vx/test / test-false
Description:
  • Async Test expected to be false
Function Name:
  • test-false
Return Type:
  • vx/test/testresult
Arguments:
  • Name
    Type
    Generic
    Description
    fn-actual
    vx/core/any<-func-async
Usage/Test Cases:
Source Code:
  • (func test-false : testresult [fn-actual : any<-func-async] (testresult :code :false :expected false :fn-actual fn-actual) :context :messages :doc "Async Test expected to be false")
vx/test / test-gt
Description:
  • Test expected greater than actual
Function Name:
  • test-gt
Return Type:
  • vx/test/testresult
Arguments:
  • Name
    Type
    Generic
    Description
    expected
    vx/core/any
    actual
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func test-gt : testresult [expected : any actual : any] (testresult :code :gt :passfail (> expected actual) :expected expected :actual actual) :context :messages :doc "Test expected greater than actual")
vx/test / test-gt
Description:
  • Async Test expected greater than actual
Function Name:
  • test-gt
Return Type:
  • vx/test/testresult
Arguments:
  • Name
    Type
    Generic
    Description
    expected
    vx/core/any
    fn-actual
    vx/core/any<-func-async
Usage/Test Cases:
Source Code:
  • (func test-gt : testresult [expected : any fn-actual : any<-func-async] (testresult :code :gt :expected expected :fn-actual fn-actual) :context :messages :doc "Async Test expected greater than actual")
vx/test / test-ne
Description:
  • Test expected not equal actual
Function Name:
  • test-ne
Return Type:
  • vx/test/testresult
Arguments:
  • Name
    Type
    Generic
    Description
    expected
    vx/core/any
    actual
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func test-ne : testresult [expected : any actual : any] (testresult :code :ne :passfail (!= expected actual) :expected expected :actual actual) :context :messages :doc "Test expected not equal actual")
vx/test / test-ne
Description:
  • Async Test expected not equal actual
Function Name:
  • test-ne
Return Type:
  • vx/test/testresult
Arguments:
  • Name
    Type
    Generic
    Description
    expected
    vx/core/any
    fn-actual
    vx/core/any<-func-async
Usage/Test Cases:
Source Code:
  • (func test-ne : testresult [expected : any fn-actual : any<-func-async] (testresult :code :ne :expected expected :fn-actual fn-actual) :context :messages :doc "Async Test expected not equal actual")
vx/test / test-string
Description:
  • Test that the string version of expected equal actual
Function Name:
  • test-string
Return Type:
  • vx/test/testresult
Arguments:
  • Name
    Type
    Generic
    Description
    expected
    vx/core/any
    actual
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func test-string : testresult [expected : any actual : any] (testresult :passfail (= (string<-any expected) (string<-any actual)) :expected expected :actual actual) :context :messages :doc "Test that the string version of expected equal actual")
vx/test / test-string
Description:
  • Async Test that the string version of expected equal actual
Function Name:
  • test-string
Return Type:
  • vx/test/testresult
Arguments:
  • Name
    Type
    Generic
    Description
    expected
    vx/core/any
    fn-actual
    vx/core/any<-func-async
Usage/Test Cases:
Source Code:
  • (func test-string : testresult [expected : any fn-actual : any<-func-async] (testresult :code :string :expected expected :fn-actual fn-actual) :context :messages :doc "Async Test that the string version of expected equal actual")
vx/test / test-true
Description:
  • Test expected to be true
Function Name:
  • test-true
Return Type:
  • vx/test/testresult
Arguments:
  • Name
    Type
    Generic
    Description
    actual
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func test-true : testresult [actual : any] (testresult :code :true :passfail (= true actual) :expected true :actual actual) :context :messages :doc "Test expected to be true")
vx/test / test-true
Description:
  • Async Test expected to be true
Function Name:
  • test-true
Return Type:
  • vx/test/testresult
Arguments:
  • Name
    Type
    Generic
    Description
    fn-actual
    vx/core/any<-func-async
Usage/Test Cases:
Source Code:
  • (func test-true : testresult [fn-actual : any<-func-async] (testresult :code :true :expected true :fn-actual fn-actual) :context :messages :doc "Async Test expected to be true")
vx/test / tr<-testdescribe-casename
Description:
  • Returns tr from a testdescribe
Function Name:
  • tr<-testdescribe-casename
Return Type:
  • vx/web/html/tr
Arguments:
  • Name
    Type
    Generic
    Description
    testdescribe
    vx/test/testdescribe
    casename
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func tr<-testdescribe-casename : tr [testdescribe : testdescribe casename : string] (let : tr [describename : string := (:describename testdescribe) result : testresult := (:testresult testdescribe) passfail : boolean := (:passfail result) expected : string := (string<-any (:expected result)) actual : string := (string<-any (:actual result)) prestyle : style := (style<-stylesheet-name stylesheet-test ".preformatted")] (tr (td (p<-passfail passfail)) (td (p :style prestyle :text casename)) (td (p :style prestyle :text describename)) (td (p :style prestyle :text expected)) (td (p :style prestyle :text actual)) ) ) :doc "Returns tr from a testdescribe")
vx/test / trlist<-testcase
Description:
Function Name:
  • trlist<-testcase
Return Type:
  • vx/web/html/trlist
Arguments:
  • Name
    Type
    Generic
    Description
    testcase
    vx/test/testcase
Usage/Test Cases:
Source Code:
  • (func trlist<-testcase : trlist [testcase : testcase] (let : trlist [describelist : testdescribelist := (:describelist testcase) casename : string := (:casename testcase)] (list<-list : trlist describelist (fn : tr [testdescribe : testdescribe] (tr<-testdescribe-casename testdescribe casename)) ) ) :doc "")
vx/test / trlist<-testcaselist
Description:
  • Returns a trlist from a testcaselist.
Function Name:
  • trlist<-testcaselist
Return Type:
  • vx/web/html/trlist
Arguments:
  • Name
    Type
    Generic
    Description
    testcaselist
    vx/test/testcaselist
Usage/Test Cases:
Source Code:
  • (func trlist<-testcaselist : trlist [testcaselist : testcaselist] (list-join<-list : trlist testcaselist trlist<-testcase) :doc "Returns a trlist from a testcaselist.")
vx/translate
Description:
  • Language to language translation tools
Package Name:
  • vx/translate
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    csv
    vx/data/csv
    fil
    vx/data/file
Types:
Constants:
Functions:
  • session<-session-name, session<-session-translation, session<-session-translationmap-name, translate, translate, translation<-context, translate<-translation-string, translate<-translationmap-name-string, translation<-session-name, translation-load-session, translationmap<-translations
Source Code:
  • (package vx/translate :libs (lib csv :path vx/data/csv) (lib fil :path vx/data/file) :doc "Language to language translation tools") (func session<-session-name : session [session : session name : string] (copy session :translation (translation<-session-name session name)) :doc "Returns an updated session with a translationmap and a translation name.") (func session<-session-translation : session [session : session translation : translation] (copy session :translation translation) :doc "Returns an updated session with a translation.") (func session<-session-translationmap-name : session [session : session translationmap : translationmap name : string] (copy session :translation (any<-map translationmap name) :translationmap translationmap) :doc "Returns an updated session with a translationmap and a translation name.") (func translate : string [text : string] (translate<-translation-string (translation<-context) text) :test (test "!NotFound!" (translate "!NotFound!")) :context :doc "Returns a translated string from current context.") (func translate : string [msg : msg] (let : string [path : string := (:path msg) code : string := (:code msg) text : string := (string "!" path " " code)] (translate text)) :test (test "Repl Type Not Found" (translate (msg :path "vx/repl/repl/repl<-string-argmap" :code "repltypenotfound"))) :context :doc "Returns a translated string from a msg.") (func translation<-context : translation (:translation (session<-context)) :context :doc "Returns a translated string from current context.") (func translate<-translation-string : string [translation : translation text : string] (if : string (is-empty translation) text (let : string [wordmap : stringmap := (:wordmap translation) xlate : string := (any<-map wordmap text)] (if : string (is-empty xlate) text xlate))) :test (test "Hola" (translate<-translation-string (translation :wordmap (stringmap "Hello" "Hola")) "Hello")) :doc "Returns a translated string from a translation or the original text if not found.") (func translate<-translationmap-name-string : string [translationmap : translationmap name : string text : string] (let : string [translation : translation := (any<-map translationmap name)] (translate<-translation-string translation text)) :doc "Returns a translated string from a translation map given a translation name and text.") (func translation<-session-name : translation [session : session name : string] (let : translation [translationmap : translationmap := (:translationmap session)] (any<-map : translation translationmap name)) :doc "Returns a translation from a session by name.") (func translation-load-session : translation [translation : translation] :context :sideeffects "Alters current (:translation session)" :doc "Returns a translation from the translation folder.") (func translationmap<-translations : translationmap [translations : translationlist :...] (map<-list : translationmap translations (fn : string [translation : translation] (:name translation))) :doc "Returns a translationmap from one or more translations.")
vx/translate / session<-session-name
Description:
  • Returns an updated session with a translationmap and a translation name.
Function Name:
  • session<-session-name
Return Type:
  • vx/core/session
Arguments:
  • Name
    Type
    Generic
    Description
    session
    vx/core/session
    name
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func session<-session-name : session [session : session name : string] (copy session :translation (translation<-session-name session name)) :doc "Returns an updated session with a translationmap and a translation name.")
vx/translate / session<-session-translation
Description:
  • Returns an updated session with a translation.
Function Name:
  • session<-session-translation
Return Type:
  • vx/core/session
Arguments:
  • Name
    Type
    Generic
    Description
    session
    vx/core/session
    translation
    vx/core/translation
Usage/Test Cases:
Source Code:
  • (func session<-session-translation : session [session : session translation : translation] (copy session :translation translation) :doc "Returns an updated session with a translation.")
vx/translate / session<-session-translationmap-name
Description:
  • Returns an updated session with a translationmap and a translation name.
Function Name:
  • session<-session-translationmap-name
Return Type:
  • vx/core/session
Arguments:
  • Name
    Type
    Generic
    Description
    session
    vx/core/session
    translationmap
    vx/core/translationmap
    name
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func session<-session-translationmap-name : session [session : session translationmap : translationmap name : string] (copy session :translation (any<-map translationmap name) :translationmap translationmap) :doc "Returns an updated session with a translationmap and a translation name.")
vx/translate / translate
Description:
  • Returns a translated string from current context.
Function Name:
  • translate
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
Usage/Test Cases:
  • (test "!NotFound!" (translate "!NotFound!"))
Source Code:
  • (func translate : string [text : string] (translate<-translation-string (translation<-context) text) :test (test "!NotFound!" (translate "!NotFound!")) :context :doc "Returns a translated string from current context.")
vx/translate / translate
Description:
  • Returns a translated string from a msg.
Function Name:
  • translate
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    msg
    vx/core/msg
Usage/Test Cases:
  • (test "Repl Type Not Found" (translate (msg :path "vx/repl/repl/repl<-string-argmap" :code "repltypenotfound")))
Source Code:
  • (func translate : string [msg : msg] (let : string [path : string := (:path msg) code : string := (:code msg) text : string := (string "!" path " " code)] (translate text)) :test (test "Repl Type Not Found" (translate (msg :path "vx/repl/repl/repl<-string-argmap" :code "repltypenotfound"))) :context :doc "Returns a translated string from a msg.")
vx/translate / translation<-context
Description:
  • Returns a translated string from current context.
Function Name:
  • translation<-context
Return Type:
  • vx/core/translation
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func translation<-context : translation (:translation (session<-context)) :context :doc "Returns a translated string from current context.")
vx/translate / translate<-translation-string
Description:
  • Returns a translated string from a translation or the original text if not found.
Function Name:
  • translate<-translation-string
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    translation
    vx/core/translation
    text
    vx/core/string
Usage/Test Cases:
  • (test "Hola" (translate<-translation-string (translation :wordmap (stringmap "Hello" "Hola")) "Hello"))
Source Code:
  • (func translate<-translation-string : string [translation : translation text : string] (if : string (is-empty translation) text (let : string [wordmap : stringmap := (:wordmap translation) xlate : string := (any<-map wordmap text)] (if : string (is-empty xlate) text xlate))) :test (test "Hola" (translate<-translation-string (translation :wordmap (stringmap "Hello" "Hola")) "Hello")) :doc "Returns a translated string from a translation or the original text if not found.")
vx/translate / translate<-translationmap-name-string
Description:
  • Returns a translated string from a translation map given a translation name and text.
Function Name:
  • translate<-translationmap-name-string
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    translationmap
    vx/core/translationmap
    name
    vx/core/string
    text
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func translate<-translationmap-name-string : string [translationmap : translationmap name : string text : string] (let : string [translation : translation := (any<-map translationmap name)] (translate<-translation-string translation text)) :doc "Returns a translated string from a translation map given a translation name and text.")
vx/translate / translation<-session-name
Description:
  • Returns a translation from a session by name.
Function Name:
  • translation<-session-name
Return Type:
  • vx/core/translation
Arguments:
  • Name
    Type
    Generic
    Description
    session
    vx/core/session
    name
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func translation<-session-name : translation [session : session name : string] (let : translation [translationmap : translationmap := (:translationmap session)] (any<-map : translation translationmap name)) :doc "Returns a translation from a session by name.")
vx/translate / translation-load-session
Description:
  • Returns a translation from the translation folder.
Function Name:
  • translation-load-session
Return Type:
  • vx/core/translation
Arguments:
  • Name
    Type
    Generic
    Description
    translation
    vx/core/translation
Usage/Test Cases:
Source Code:
  • (func translation-load-session : translation [translation : translation] :context :sideeffects "Alters current (:translation session)" :doc "Returns a translation from the translation folder.")
vx/translate / translationmap<-translations
Description:
  • Returns a translationmap from one or more translations.
Function Name:
  • translationmap<-translations
Return Type:
  • vx/core/translationmap
Arguments:
  • Name
    Type
    Generic
    Description
    translations
    vx/core/translationlist
Usage/Test Cases:
Source Code:
  • (func translationmap<-translations : translationmap [translations : translationlist :...] (map<-list : translationmap translations (fn : string [translation : translation] (:name translation))) :doc "Returns a translationmap from one or more translations.")
vx/translation/all
Description:
  • Translation utilities
Package Name:
  • vx/translation/all
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    trn
    vx/translate
    en
    vx/translation/en
    es
    vx/translation/es
Types:
Constants:
Functions:
  • context-all, translationmap-all
Source Code:
  • (package vx/translation/all :libs (lib trn :path vx/translate) (lib en :path vx/translation/en) (lib es :path vx/translation/es) :doc "Translation utilities") (func context-all : context [args : anylist :...] (context :session (session :translation (translation-en) :translationmap (translationmap-all))) :doc "Returns the default context for app main execution. Arguments come from the command line.") (func translationmap-all : translationmap (trn/translationmap<-translations (en/translation-en) (es/translation-es)) :test (test "Hola" (trn/translate<-translationmap-name-string (translationmap-all) "es" "Hello")) :doc "Returns a translationmap with all translations.")
vx/translation/all / context-all
Description:
  • Returns the default context for app main execution. Arguments come from the command line.
Function Name:
  • context-all
Return Type:
  • vx/core/context
Arguments:
  • Name
    Type
    Generic
    Description
    args
    vx/core/anylist
Usage/Test Cases:
Source Code:
  • (func context-all : context [args : anylist :...] (context :session (session :translation (translation-en) :translationmap (translationmap-all))) :doc "Returns the default context for app main execution. Arguments come from the command line.")
vx/translation/all / translationmap-all
Description:
  • Returns a translationmap with all translations.
Function Name:
  • translationmap-all
Return Type:
  • vx/core/translationmap
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
  • (test "Hola" (trn/translate<-translationmap-name-string (translationmap-all) "es" "Hello"))
Source Code:
  • (func translationmap-all : translationmap (trn/translationmap<-translations (en/translation-en) (es/translation-es)) :test (test "Hola" (trn/translate<-translationmap-name-string (translationmap-all) "es" "Hello")) :doc "Returns a translationmap with all translations.")
vx/translation/en
Description:
  • English Translation Stub
Package Name:
  • vx/translation/en
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    file
    vx/data/file
    trn
    vx/translate
Types:
Constants:
Functions:
  • context-en, context-test, securitydata-test, translation-en, words
Source Code:
  • (package vx/translation/en :libs (lib file :path vx/data/file) (lib trn :path vx/translate) :doc "English Translation Stub") (func context-en : context [args : anylist :...] (context :session (session :translation (translation-en))) :doc "Returns the default context for app main execution. Arguments come from the command line.") (func context-test : context [args : anylist :...] (context :session (session :translation (translation-en) :user (user :security (securitydata-test)))) :doc "Returns the default context for test case execution. Arguments come from the command line.") (func securitydata-test : security (security :allowfuncs (funclist file/boolean-write<-file-any file/boolean-write<-file-string file/file-read<-file file/string-read<-file)) :doc "Returns the default security for test case execution. Arguments come from the command line.") (func translation-en : translation (translation :name "en" :wordmap (words)) :test (test "Hello" (trn/translate<-translation-string (translation-en) "Hello")) :doc "Returns translation data") (func words : stringmap (stringmap "Hello" "Hello" "World" "World" "!vx/core/func exception" "Exception in Function" "!vx/core/func permissiondenied" "Permission Denied to Function" "!vx/repl/repl/repl<-string-argmap repltypenotfound" "Repl Type Not Found" ) :doc "Word Translation")
vx/translation/en / context-en
Description:
  • Returns the default context for app main execution. Arguments come from the command line.
Function Name:
  • context-en
Return Type:
  • vx/core/context
Arguments:
  • Name
    Type
    Generic
    Description
    args
    vx/core/anylist
Usage/Test Cases:
Source Code:
  • (func context-en : context [args : anylist :...] (context :session (session :translation (translation-en))) :doc "Returns the default context for app main execution. Arguments come from the command line.")
vx/translation/en / context-test
Description:
  • Returns the default context for test case execution. Arguments come from the command line.
Function Name:
  • context-test
Return Type:
  • vx/core/context
Arguments:
  • Name
    Type
    Generic
    Description
    args
    vx/core/anylist
Usage/Test Cases:
Source Code:
  • (func context-test : context [args : anylist :...] (context :session (session :translation (translation-en) :user (user :security (securitydata-test)))) :doc "Returns the default context for test case execution. Arguments come from the command line.")
vx/translation/en / securitydata-test
Description:
  • Returns the default security for test case execution. Arguments come from the command line.
Function Name:
  • securitydata-test
Return Type:
  • vx/core/security
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func securitydata-test : security (security :allowfuncs (funclist file/boolean-write<-file-any file/boolean-write<-file-string file/file-read<-file file/string-read<-file)) :doc "Returns the default security for test case execution. Arguments come from the command line.")
vx/translation/en / translation-en
Description:
  • Returns translation data
Function Name:
  • translation-en
Return Type:
  • vx/core/translation
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
  • (test "Hello" (trn/translate<-translation-string (translation-en) "Hello"))
Source Code:
  • (func translation-en : translation (translation :name "en" :wordmap (words)) :test (test "Hello" (trn/translate<-translation-string (translation-en) "Hello")) :doc "Returns translation data")
vx/translation/en / words
Description:
  • Word Translation
Function Name:
  • words
Return Type:
  • vx/core/stringmap
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func words : stringmap (stringmap "Hello" "Hello" "World" "World" "!vx/core/func exception" "Exception in Function" "!vx/core/func permissiondenied" "Permission Denied to Function" "!vx/repl/repl/repl<-string-argmap repltypenotfound" "Repl Type Not Found" ) :doc "Word Translation")
vx/translation/es
Description:
  • Spanish Translation Stub
Package Name:
  • vx/translation/es
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    trn
    vx/translate
Types:
Constants:
Functions:
  • translation-es, words
Source Code:
  • (package vx/translation/es :libs (lib trn :path vx/translate) :doc "Spanish Translation Stub") (func translation-es : translation (translation :name "es" :wordmap (words)) :test (test "Hola" (trn/translate<-translation-string (translation-es) "Hello")) :doc "Returns translation data") (func words : stringmap (stringmap "Hello" "Hola" "World" "Mundo" ) :doc "Word Translation")
vx/translation/es / translation-es
Description:
  • Returns translation data
Function Name:
  • translation-es
Return Type:
  • vx/core/translation
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
  • (test "Hola" (trn/translate<-translation-string (translation-es) "Hello"))
Source Code:
  • (func translation-es : translation (translation :name "es" :wordmap (words)) :test (test "Hola" (trn/translate<-translation-string (translation-es) "Hello")) :doc "Returns translation data")
vx/translation/es / words
Description:
  • Word Translation
Function Name:
  • words
Return Type:
  • vx/core/stringmap
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func words : stringmap (stringmap "Hello" "Hola" "World" "Mundo" ) :doc "Word Translation")
vx/type
Description:
  • Type handling tools.
Package Name:
  • vx/type
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
Types:
Constants:
Functions:
  • allowtypenames<-type, allowtypes<-type, any<-int, boolean<-string-ends, boolean<-string-starts, int<-string-find, int<-string-findkeyword, int<-string-findlast, is-boolean, is-decimal, is-none, is-string, is-type, is-type<-any-typelist, length<-string, string<-int, string<-string-end, string<-string-start, string<-string-start-end, string<-stringlist-join, string-lowercase, string-outdent, string-trim, string-uppercase, stringlist<-string-split, traitnames<-any, traits<-any, traits<-typedef
Source Code:
  • (package vx/type :doc "Type handling tools.") (func allowtypenames<-type : stringlist [type : any] (typenames<-typelist (allowtypes<-type type)) :doc "Get the name of a given type") (func allowtypes<-type : typelist [type : any] (:allowtypes (typedef<-type type)) :doc "Returns the allowed types from a given type") (func any<-int : any-1 [val : int] :doc "Generic function returns any from an int.") (func boolean<-string-ends : boolean [text : string ends : string] (native :cpp "bool check = vx_core::vx_boolean_from_string_ends(text->vx_string(), ends->vx_string()); output = vx_core::vx_new_boolean(check);" :js "vx_core.vx_boolean_from_string_ends(text, ends)" :java "boolean check = Core.vx_boolean_from_string_ends(text.vx_string(), ends.vx_string()); output = Core.vx_new_boolean(check);") :test (test-true (boolean<-string-ends "abcd" "cd")) :doc "Returns true if string starts with find.") (func boolean<-string-starts : boolean [text : string starts : string] (native :cpp "bool check = vx_core::vx_boolean_from_string_starts(text->vx_string(), starts->vx_string()); output = vx_core::vx_new_boolean(check);" :js "vx_core.vx_boolean_from_string_starts(text, starts)" :java "boolean check = Core.vx_boolean_from_string_starts(text.vx_string(), starts.vx_string()); output = Core.vx_new_boolean(check);") :test (test-true (boolean<-string-starts "abcd" "ab")) :doc "Returns true if string starts with find.") (func int<-string-find : int [text : string find : string] (native :cpp :auto :java :auto :js :auto) :test (test 3 (int<-string-find "abcdcdg" "cd")) :doc "Returns integer position of find string in text string.") (func int<-string-findkeyword : int [text : string find : string] (native :cpp :auto :js :auto :java :auto) :test (test 3 (int<-string-findkeyword "ab\tcdefg" ":whitespace")) (test 5 (int<-string-findkeyword " \t\n\rab" ":nonwhitespace")) :doc "Returns integer position of find string in text string. Note: the find terms :whitespace and :nonwhitespace have special meaning.") (func int<-string-findlast : int [text : string findlast : string] (native :cpp :auto :java :auto :js :auto) :test (test 5 (int<-string-findlast "abcdcdg" "cd")) :doc "Returns integer position of find string in text string.") (func is-boolean : boolean [value : any] (= "boolean" (typename<-any value))) (func is-decimal : boolean [value : any] (= "decimal" (typename<-any value))) (func is-none : boolean [value : any] (= value none)) (func is-string : boolean [value : any] (= "vx/core/string" (typename<-any value)) :test (test-true (is-string "")) (test-true (is-string "a")) (test-false (is-string 5)) (test-false (is-string (list)))) (func is-type : boolean [val : any type : any] (or (= (typename<-type type) (typename<-any val)) (contains (allowtypenames<-type type) (typename<-any val)) (contains (traitnames<-any val) (typename<-type type))) :test (test-true (is-type false boolean)) (test-true (is-type "a" string)) (test-true (is-type 5.5 number)) (test-true (is-type 4 int))) (func is-type<-any-typelist : boolean [val : any typelist : typelist] (any<-list-start-reduce : boolean typelist false (fn : boolean [result : boolean type : any] (or result (is-type val type)))) :test (test-true (is-type<-any-typelist false (typelist int boolean))) (test-true (is-type<-any-typelist "a" (typelist number string))) (test-true (is-type<-any-typelist 5.5 (typelist string number))) (test-true (is-type<-any-typelist 4 (typelist string int))) :doc "Returns true if val is any type in typelist.") (func length<-string : int [text : string] (native :cpp "long len = text->vx_string().length(); output = vx_core::vx_new_int(len);" :js "text.length" :java "int len = text.vx_string().length(); output = Core.vx_new_int(len);") :test (test 4 (length<-string "abcd")) (test 0 (length<-string "")) :doc "Returns length of a string.") (func string<-int : string [val : int] (switch val : string (case infinity "infinity") (case neginfinity "neginfinity") (case notanumber "notanumber") (else (string val))) :test (test "4" (string<-int 4)) (test "51" (string<-int 51)) (test "notanumber" (string<-int notanumber)) (test "infinity" (string<-int infinity)) (test "neginfinity" (string<-int neginfinity)) :doc "Function Type converting int to string") (func string<-string-end : string [text : string endpos : int] (string<-string-start-end text 1 endpos) :test (test "abc" (string<-string-end "abcd" 3)) (test "ab" (string<-string-end "abcd" 2)) :doc "Returns a substring between 0 end position.") (func string<-string-start : string [text : string startpos : int] (string<-string-start-end text startpos (length<-string text)) :test (test "abcd" (string<-string-start "abcd" 1)) (test "bcd" (string<-string-start "abcd" 2)) :doc "Returns a substring between start string end.") (func string<-string-start-end : string [text : string start : int end : int] (native :cpp "std::string str = vx_core::vx_string_from_string_start_end(text->vx_string(), start->vx_int(), end->vx_int()); output = vx_core::vx_new_string(str);" :js "vx_core.vx_string_from_string_start_end(text, start, end)" :java "String stext = Core.vx_string_from_string_start_end(text.vx_string(), start.vx_int(), end.vx_int()); output = Core.vx_new_string(stext);") :test (test "abc" (string<-string-start-end "abcd" 1 3)) (test "bc" (string<-string-start-end "abcd" 2 3)) (test "" (string<-string-start-end "abcd" 5 6)) (test "bcd" (string<-string-start-end "abcd" 2 5)) (test "bc" (string<-string-start-end "abcd" 2 -1)) :doc "Returns a substring between start and end positions.") (func string<-stringlist-join : string [vals : stringlist delim : string] (native :cpp "output = vx_type::vx_string_from_stringlist_join(vals, delim);" :java :auto :js "vals.join(delim)") :test (test "a$b$c" (string<-stringlist-join (stringlist "a" "b" "c") "$")) :doc "Returns a string by joining a stringlist by the delimiter") (func string-lowercase : string [text : string] (native :cpp :auto :java :auto :js :auto) :test (test "abc" (string-lowercase "AbC")) :doc "Returns lowercase version of string") (func string-outdent : string [text : string] (let : string [pos : int := (int<-string-findkeyword text :nonwhitespace)] (if : string (then (= 0 pos) text) (else (let : string [indent : string := (string<-string-end text (-1 pos)) rest : string := (string<-string-start text pos) linepos : int := (int<-string-find indent "\n") outdent : string := (if : string (= 0 linepos) "" "\n")] (string<-string-find-replace rest indent outdent))))) :test (test "ab" (string-outdent "ab")) (test "a\nb" (string-outdent "\n a\n b")) :doc "Returns a string replacing leading whitespace on all lines based on first line.") (func string-trim : string [text : string] (native :cpp :auto :js :auto :java :auto) :test (test "ab" (string-trim " \t\nab\n\t ")) :doc "Trims whitespace from the front and back of text") (func string-uppercase : string [text : string] (native :cpp :auto :java :auto :js :auto) :test (test "ABC" (string-uppercase "aBc")) :doc "Returns uppercase version of string") (func stringlist<-string-split : stringlist [text : string delim : string] (native :cpp "vx_type::vx_stringlist_from_string_split(text, delim);" :java :auto :js "vx_type.vx_stringlist_from_string_split(text, delim)") :test (test (stringlist "a" "b" "c") (stringlist<-string-split "a$b$c" "$")) :doc "Returns a stringlist by splitting a string by the delimiter") (func traitnames<-any : stringlist [val : any] (typenames<-typelist (traits<-any val)) :doc "Get the trait names of a given type") (func traits<-any : typelist [val : any] (traits<-typedef (typedef<-any val)) :doc "Get the traits of a given value") (func traits<-typedef : typelist [vtypedef : typedef] (:traits vtypedef) :doc "Get the traits of a given typedef")
vx/type / allowtypenames<-type
Description:
  • Get the name of a given type
Function Name:
  • allowtypenames<-type
Return Type:
  • vx/core/stringlist
Arguments:
  • Name
    Type
    Generic
    Description
    type
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func allowtypenames<-type : stringlist [type : any] (typenames<-typelist (allowtypes<-type type)) :doc "Get the name of a given type")
vx/type / allowtypes<-type
Description:
  • Returns the allowed types from a given type
Function Name:
  • allowtypes<-type
Return Type:
  • vx/core/typelist
Arguments:
  • Name
    Type
    Generic
    Description
    type
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func allowtypes<-type : typelist [type : any] (:allowtypes (typedef<-type type)) :doc "Returns the allowed types from a given type")
vx/type / any<-int
Description:
  • Generic function returns any from an int.
Function Name:
  • any<-int
Return Type:
  • vx/core/any-1
Arguments:
  • Name
    Type
    Generic
    Description
    val
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func any<-int : any-1 [val : int] :doc "Generic function returns any from an int.")
vx/type / boolean<-string-ends
Description:
  • Returns true if string starts with find.
Function Name:
  • boolean<-string-ends
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    ends
    vx/core/string
Usage/Test Cases:
  • (test-true (boolean<-string-ends "abcd" "cd"))
Source Code:
  • (func boolean<-string-ends : boolean [text : string ends : string] (native :cpp "bool check = vx_core::vx_boolean_from_string_ends(text->vx_string(), ends->vx_string()); output = vx_core::vx_new_boolean(check);" :js "vx_core.vx_boolean_from_string_ends(text, ends)" :java "boolean check = Core.vx_boolean_from_string_ends(text.vx_string(), ends.vx_string()); output = Core.vx_new_boolean(check);") :test (test-true (boolean<-string-ends "abcd" "cd")) :doc "Returns true if string starts with find.")
vx/type / boolean<-string-starts
Description:
  • Returns true if string starts with find.
Function Name:
  • boolean<-string-starts
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    starts
    vx/core/string
Usage/Test Cases:
  • (test-true (boolean<-string-starts "abcd" "ab"))
Source Code:
  • (func boolean<-string-starts : boolean [text : string starts : string] (native :cpp "bool check = vx_core::vx_boolean_from_string_starts(text->vx_string(), starts->vx_string()); output = vx_core::vx_new_boolean(check);" :js "vx_core.vx_boolean_from_string_starts(text, starts)" :java "boolean check = Core.vx_boolean_from_string_starts(text.vx_string(), starts.vx_string()); output = Core.vx_new_boolean(check);") :test (test-true (boolean<-string-starts "abcd" "ab")) :doc "Returns true if string starts with find.")
vx/type / int<-string-find
Description:
  • Returns integer position of find string in text string.
Function Name:
  • int<-string-find
Return Type:
  • vx/core/int
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    find
    vx/core/string
Usage/Test Cases:
  • (test 3 (int<-string-find "abcdcdg" "cd"))
Source Code:
  • (func int<-string-find : int [text : string find : string] (native :cpp :auto :java :auto :js :auto) :test (test 3 (int<-string-find "abcdcdg" "cd")) :doc "Returns integer position of find string in text string.")
vx/type / int<-string-findkeyword
Description:
  • Returns integer position of find string in text string. Note: the find terms :whitespace and :nonwhitespace have special meaning.
Function Name:
  • int<-string-findkeyword
Return Type:
  • vx/core/int
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    find
    vx/core/string
Usage/Test Cases:
  • (test 3 (int<-string-findkeyword "ab\tcdefg" ":whitespace"))
  • (test 5 (int<-string-findkeyword " \t\n\rab" ":nonwhitespace"))
Source Code:
  • (func int<-string-findkeyword : int [text : string find : string] (native :cpp :auto :js :auto :java :auto) :test (test 3 (int<-string-findkeyword "ab\tcdefg" ":whitespace")) (test 5 (int<-string-findkeyword " \t\n\rab" ":nonwhitespace")) :doc "Returns integer position of find string in text string. Note: the find terms :whitespace and :nonwhitespace have special meaning.")
vx/type / int<-string-findlast
Description:
  • Returns integer position of find string in text string.
Function Name:
  • int<-string-findlast
Return Type:
  • vx/core/int
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    findlast
    vx/core/string
Usage/Test Cases:
  • (test 5 (int<-string-findlast "abcdcdg" "cd"))
Source Code:
  • (func int<-string-findlast : int [text : string findlast : string] (native :cpp :auto :java :auto :js :auto) :test (test 5 (int<-string-findlast "abcdcdg" "cd")) :doc "Returns integer position of find string in text string.")
vx/type / is-boolean
Description:
Function Name:
  • is-boolean
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func is-boolean : boolean [value : any] (= "boolean" (typename<-any value)))
vx/type / is-decimal
Description:
Function Name:
  • is-decimal
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func is-decimal : boolean [value : any] (= "decimal" (typename<-any value)))
vx/type / is-none
Description:
Function Name:
  • is-none
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func is-none : boolean [value : any] (= value none))
vx/type / is-string
Description:
Function Name:
  • is-string
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    value
    vx/core/any
Usage/Test Cases:
  • (test-true (is-string ""))
  • (test-true (is-string "a"))
  • (test-false (is-string 5))
  • (test-false (is-string (list)))
Source Code:
  • (func is-string : boolean [value : any] (= "vx/core/string" (typename<-any value)) :test (test-true (is-string "")) (test-true (is-string "a")) (test-false (is-string 5)) (test-false (is-string (list))))
vx/type / is-type
Description:
Function Name:
  • is-type
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    val
    vx/core/any
    type
    vx/core/any
Usage/Test Cases:
  • (test-true (is-type false boolean))
  • (test-true (is-type "a" string))
  • (test-true (is-type 5.5 number))
  • (test-true (is-type 4 int))
Source Code:
  • (func is-type : boolean [val : any type : any] (or (= (typename<-type type) (typename<-any val)) (contains (allowtypenames<-type type) (typename<-any val)) (contains (traitnames<-any val) (typename<-type type))) :test (test-true (is-type false boolean)) (test-true (is-type "a" string)) (test-true (is-type 5.5 number)) (test-true (is-type 4 int)))
vx/type / is-type<-any-typelist
Description:
  • Returns true if val is any type in typelist.
Function Name:
  • is-type<-any-typelist
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    val
    vx/core/any
    typelist
    vx/core/typelist
Usage/Test Cases:
  • (test-true (is-type<-any-typelist false (typelist int boolean)))
  • (test-true (is-type<-any-typelist "a" (typelist number string)))
  • (test-true (is-type<-any-typelist 5.5 (typelist string number)))
  • (test-true (is-type<-any-typelist 4 (typelist string int)))
Source Code:
  • (func is-type<-any-typelist : boolean [val : any typelist : typelist] (any<-list-start-reduce : boolean typelist false (fn : boolean [result : boolean type : any] (or result (is-type val type)))) :test (test-true (is-type<-any-typelist false (typelist int boolean))) (test-true (is-type<-any-typelist "a" (typelist number string))) (test-true (is-type<-any-typelist 5.5 (typelist string number))) (test-true (is-type<-any-typelist 4 (typelist string int))) :doc "Returns true if val is any type in typelist.")
vx/type / length<-string
Description:
  • Returns length of a string.
Function Name:
  • length<-string
Return Type:
  • vx/core/int
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
Usage/Test Cases:
  • (test 4 (length<-string "abcd"))
  • (test 0 (length<-string ""))
Source Code:
  • (func length<-string : int [text : string] (native :cpp "long len = text->vx_string().length(); output = vx_core::vx_new_int(len);" :js "text.length" :java "int len = text.vx_string().length(); output = Core.vx_new_int(len);") :test (test 4 (length<-string "abcd")) (test 0 (length<-string "")) :doc "Returns length of a string.")
vx/type / string<-int
Description:
  • Function Type converting int to string
Function Name:
  • string<-int
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    val
    vx/core/int
Usage/Test Cases:
  • (test "4" (string<-int 4))
  • (test "51" (string<-int 51))
  • (test "notanumber" (string<-int notanumber))
  • (test "infinity" (string<-int infinity))
  • (test "neginfinity" (string<-int neginfinity))
Source Code:
  • (func string<-int : string [val : int] (switch val : string (case infinity "infinity") (case neginfinity "neginfinity") (case notanumber "notanumber") (else (string val))) :test (test "4" (string<-int 4)) (test "51" (string<-int 51)) (test "notanumber" (string<-int notanumber)) (test "infinity" (string<-int infinity)) (test "neginfinity" (string<-int neginfinity)) :doc "Function Type converting int to string")
vx/type / string<-string-end
Description:
  • Returns a substring between 0 end position.
Function Name:
  • string<-string-end
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    endpos
    vx/core/int
Usage/Test Cases:
  • (test "abc" (string<-string-end "abcd" 3))
  • (test "ab" (string<-string-end "abcd" 2))
Source Code:
  • (func string<-string-end : string [text : string endpos : int] (string<-string-start-end text 1 endpos) :test (test "abc" (string<-string-end "abcd" 3)) (test "ab" (string<-string-end "abcd" 2)) :doc "Returns a substring between 0 end position.")
vx/type / string<-string-start
Description:
  • Returns a substring between start string end.
Function Name:
  • string<-string-start
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    startpos
    vx/core/int
Usage/Test Cases:
  • (test "abcd" (string<-string-start "abcd" 1))
  • (test "bcd" (string<-string-start "abcd" 2))
Source Code:
  • (func string<-string-start : string [text : string startpos : int] (string<-string-start-end text startpos (length<-string text)) :test (test "abcd" (string<-string-start "abcd" 1)) (test "bcd" (string<-string-start "abcd" 2)) :doc "Returns a substring between start string end.")
vx/type / string<-string-start-end
Description:
  • Returns a substring between start and end positions.
Function Name:
  • string<-string-start-end
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    start
    vx/core/int
    end
    vx/core/int
Usage/Test Cases:
  • (test "abc" (string<-string-start-end "abcd" 1 3))
  • (test "bc" (string<-string-start-end "abcd" 2 3))
  • (test "" (string<-string-start-end "abcd" 5 6))
  • (test "bcd" (string<-string-start-end "abcd" 2 5))
  • (test "bc" (string<-string-start-end "abcd" 2 -1))
Source Code:
  • (func string<-string-start-end : string [text : string start : int end : int] (native :cpp "std::string str = vx_core::vx_string_from_string_start_end(text->vx_string(), start->vx_int(), end->vx_int()); output = vx_core::vx_new_string(str);" :js "vx_core.vx_string_from_string_start_end(text, start, end)" :java "String stext = Core.vx_string_from_string_start_end(text.vx_string(), start.vx_int(), end.vx_int()); output = Core.vx_new_string(stext);") :test (test "abc" (string<-string-start-end "abcd" 1 3)) (test "bc" (string<-string-start-end "abcd" 2 3)) (test "" (string<-string-start-end "abcd" 5 6)) (test "bcd" (string<-string-start-end "abcd" 2 5)) (test "bc" (string<-string-start-end "abcd" 2 -1)) :doc "Returns a substring between start and end positions.")
vx/type / string<-stringlist-join
Description:
  • Returns a string by joining a stringlist by the delimiter
Function Name:
  • string<-stringlist-join
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    vals
    vx/core/stringlist
    delim
    vx/core/string
Usage/Test Cases:
  • (test "a$b$c" (string<-stringlist-join (stringlist "a" "b" "c") "$"))
Source Code:
  • (func string<-stringlist-join : string [vals : stringlist delim : string] (native :cpp "output = vx_type::vx_string_from_stringlist_join(vals, delim);" :java :auto :js "vals.join(delim)") :test (test "a$b$c" (string<-stringlist-join (stringlist "a" "b" "c") "$")) :doc "Returns a string by joining a stringlist by the delimiter")
vx/type / string-lowercase
Description:
  • Returns lowercase version of string
Function Name:
  • string-lowercase
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
Usage/Test Cases:
  • (test "abc" (string-lowercase "AbC"))
Source Code:
  • (func string-lowercase : string [text : string] (native :cpp :auto :java :auto :js :auto) :test (test "abc" (string-lowercase "AbC")) :doc "Returns lowercase version of string")
vx/type / string-outdent
Description:
  • Returns a string replacing leading whitespace on all lines based on first line.
Function Name:
  • string-outdent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
Usage/Test Cases:
  • (test "ab" (string-outdent "ab"))
  • (test "a\nb" (string-outdent "\n a\n b"))
Source Code:
  • (func string-outdent : string [text : string] (let : string [pos : int := (int<-string-findkeyword text :nonwhitespace)] (if : string (then (= 0 pos) text) (else (let : string [indent : string := (string<-string-end text (-1 pos)) rest : string := (string<-string-start text pos) linepos : int := (int<-string-find indent "\n") outdent : string := (if : string (= 0 linepos) "" "\n")] (string<-string-find-replace rest indent outdent))))) :test (test "ab" (string-outdent "ab")) (test "a\nb" (string-outdent "\n a\n b")) :doc "Returns a string replacing leading whitespace on all lines based on first line.")
vx/type / string-trim
Description:
  • Trims whitespace from the front and back of text
Function Name:
  • string-trim
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
Usage/Test Cases:
  • (test "ab" (string-trim " \t\nab\n\t "))
Source Code:
  • (func string-trim : string [text : string] (native :cpp :auto :js :auto :java :auto) :test (test "ab" (string-trim " \t\nab\n\t ")) :doc "Trims whitespace from the front and back of text")
vx/type / string-uppercase
Description:
  • Returns uppercase version of string
Function Name:
  • string-uppercase
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
Usage/Test Cases:
  • (test "ABC" (string-uppercase "aBc"))
Source Code:
  • (func string-uppercase : string [text : string] (native :cpp :auto :java :auto :js :auto) :test (test "ABC" (string-uppercase "aBc")) :doc "Returns uppercase version of string")
vx/type / stringlist<-string-split
Description:
  • Returns a stringlist by splitting a string by the delimiter
Function Name:
  • stringlist<-string-split
Return Type:
  • vx/core/stringlist
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
    delim
    vx/core/string
Usage/Test Cases:
  • (test (stringlist "a" "b" "c") (stringlist<-string-split "a$b$c" "$"))
Source Code:
  • (func stringlist<-string-split : stringlist [text : string delim : string] (native :cpp "vx_type::vx_stringlist_from_string_split(text, delim);" :java :auto :js "vx_type.vx_stringlist_from_string_split(text, delim)") :test (test (stringlist "a" "b" "c") (stringlist<-string-split "a$b$c" "$")) :doc "Returns a stringlist by splitting a string by the delimiter")
vx/type / traitnames<-any
Description:
  • Get the trait names of a given type
Function Name:
  • traitnames<-any
Return Type:
  • vx/core/stringlist
Arguments:
  • Name
    Type
    Generic
    Description
    val
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func traitnames<-any : stringlist [val : any] (typenames<-typelist (traits<-any val)) :doc "Get the trait names of a given type")
vx/type / traits<-any
Description:
  • Get the traits of a given value
Function Name:
  • traits<-any
Return Type:
  • vx/core/typelist
Arguments:
  • Name
    Type
    Generic
    Description
    val
    vx/core/any
Usage/Test Cases:
Source Code:
  • (func traits<-any : typelist [val : any] (traits<-typedef (typedef<-any val)) :doc "Get the traits of a given value")
vx/type / traits<-typedef
Description:
  • Get the traits of a given typedef
Function Name:
  • traits<-typedef
Return Type:
  • vx/core/typelist
Arguments:
  • Name
    Type
    Generic
    Description
    vtypedef
    vx/core/typedef
Usage/Test Cases:
Source Code:
  • (func traits<-typedef : typelist [vtypedef : typedef] (:traits vtypedef) :doc "Get the traits of a given typedef")
vx/web/html
Description:
  • Html handler
Package Name:
  • vx/web/html
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    type
    vx/type
Types:
  • body, details, div, divchild, divchildlist, divlist, footer, h1, h2, h3, head, headchild, headchildlist, html, meta, node, nodelist, p, propmap, style, stylelist, stylemap, stylesheet, table, tbody, td, tdlist, thead, title, tr, trlist
Constants:
Functions:
  • htmlstring<-string, string-indent, string<-div-indent, string<-body-indent, string<-footer-indent, string<-details-indent, string<-h1-indent, string<-h2-indent, string<-h3-indent, string<-head-indent, string<-html, string<-indent, string<-meta-indent, string<-node-indent, string<-nodelist-tag-prop-indent, string<-nodelist-indent, string<-p-indent, string<-propname-val, string<-propstyle, string<-style-indent, string<-stylelist-indent, string<-stylepropmap-indent, string<-stylesheet-indent, string<-table-indent, string<-tbody-indent, string<-td-indent, string<-thead-indent, string<-title-indent, string<-tr-indent, string<-uri, styles<-stylesheet, style<-stylesheet-name, stylemap<-stylelist, stylemap<-stylesheet, stylesheet-loadmap, uri<-string
Source Code:
  • (package vx/web/html :libs (lib type :path vx/type) :doc "Html handler") (type body : struct :properties [nodes : divchildlist :... :default] :doc "Body Tag") (type details : struct :properties [summary : divchildlist nodes : divchildlist] :traits [node divchild] :doc "Details Tag") (type div : struct :properties [nodes : divchildlist :... :default] :traits [node divchild] :doc "Div Tag") (type divchild : struct :doc "Div Child Trait") (type divchildlist : list :allowtypes [divchild] :doc "List of divchild") (type divlist : list :allowtypes [div] :doc "List of div") (type footer : struct :properties [nodes : divchildlist :... :default] :doc "Body Tag") (type h1 : struct :properties [text : string :default] :traits [node divchild] :doc "Header 1 Tag") (type h2 : struct :properties [text : string :default] :traits [node divchild] :doc "Header 2 Tag") (type h3 : struct :properties [text : string :default] :traits [node divchild] :doc "Header 3 Tag") (type head : struct :properties [nodes : headchildlist :... :default] :doc "Head Tag") (type headchild : struct :doc "Head Child Trait") (type headchildlist : list :allowtypes [headchild] :doc "List of headchild") (type html : struct :properties [lang : string head : head body : body footer : footer] :doc "Html Tag") (type meta : struct :properties [charset : string] :traits [node headchild] :doc "Meta Tag") (type node : struct :properties [id : string style : style] :doc "Common Html Node Trait") (type nodelist : list :allowtypes [node] :doc "List of node") (type p : struct :properties [text : string :default] :traits [node divchild] :doc "Paragraph Tag") (type propmap : map :allowtypes [string] :doc "Map of props") (type style : struct :properties [name : string props : propmap] :doc "Programmable Cascading Style") (type stylelist : list :allowtypes [style] :doc "List of style") (type stylemap : map :allowtypes [style] :doc "Map of style") (type stylesheet : struct :properties [name : string styles : stylelist stylemap : stylemap] :traits [node headchild] :doc "Programmable Cascading Style Sheet CSS type") (type table : struct :properties [tbody : tbody thead : thead] :traits [node divchild] :doc "<table> Tag") (type tbody : struct :properties [nodes : trlist :default :...] :traits [node] :doc "<tbody> Tag") (type td : struct :properties [nodes : divchildlist :default :...] :traits [node] :doc "<tr> Tag") (type tdlist : list :allowtypes [td] :doc "List of td") (type thead : struct :properties [nodes : trlist :default :...] :traits [node] :doc "<thead> Tag") (type title : struct :properties [text : string] :traits [node headchild] :doc "Title Tag") (type tr : struct :properties [nodes : tdlist :default :...] :traits [node] :doc "<tr> Tag") (type trlist : list :allowtypes [tr] :doc "List of tr") (func htmlstring<-string : string [text : string] (native :cpp "std::string str = text->vx_string(); str = vx_core::vx_string_from_string_find_replace(str, “&”, “&amp;”); str = vx_core::vx_string_from_string_find_replace(str, “'”, “\'”); str = vx_core::vx_string_from_string_find_replace(str, “>”, “&gt;”); str = vx_core::vx_string_from_string_find_replace(str, “<”, “&lt;”); output = vx_core::vx_new_string(str);" :js "const str = “” + text output = str .replace(/&/g, “&amp;”) .replace(/'/g, “\'”) .replace(/>/g, “&gt;”) .replace(/</g, “&lt;”)" :java "String str = text.vx_string(); str = str .replaceAll(“&”, “&amp;”) .replaceAll(“'”, “\'”) .replaceAll(“>”, “&gt;”) .replaceAll(“<”, “&lt;”); output = Core.vx_new_string(str);") :doc "Convert text to HTML string") (func string-indent : string [indent : int] (string-repeat " " indent)) (func string<-div-indent : string [div : div indent : int] (let [nodes : divchildlist := (:nodes div) sid : string := (string<-propname-val "id" (:id div)) sstyle : string := (string<-propstyle (:style div))] (string<-nodelist-tag-prop-indent nodes "div" (string sid sstyle) indent) ) :test (test "<div></div>" (string<-div-indent (div) 0)) (test "<div id=\"myid\"></div>" (string<-div-indent (div :id "myid") 0)) :doc "Returns string from div") (func string<-body-indent : string [body : body indent : int] (let [nodes : divchildlist := (:nodes body)] (string<-nodelist-tag-prop-indent nodes "body" "" indent) ) :test (test "<body></body>" (string<-body-indent (body) 0)) (test "<body>\n <div></div>\n</body>" (string<-body-indent (body (div)) 0)) :doc "Returns string from body") (func string<-footer-indent : string [footer : footer indent : int] (let [nodes : divchildlist := (:nodes footer)] (string<-nodelist-tag-prop-indent nodes "footer" "" indent) ) :doc "Returns string from footer") (func string<-details-indent : string [details : details indent : int] (let [sindent : string := (string<-indent indent) summary : divchildlist := (:summary details) nodes : divchildlist := (:nodes details) ssummary : string := (string<-nodelist-indent summary (+ indent 2)) snodes : string := (string<-nodelist-indent nodes (+ indent 1))] (string sindent "<details>" sindent " <summary>" ssummary sindent " </summary>" snodes sindent "</details>") ) :doc "Returns string from details") (func string<-h1-indent : string [h1 : h1 indent : int] (let [sindent : string := (string<-indent indent) text : string := (:text h1) sid : string := (string<-propname-val "id" (:id h1))] (string sindent "<h1" sid ">" text "</h1>")) :doc "Returns string from h1") (func string<-h2-indent : string [h2 : h2 indent : int] (let [text : string := (:text h2) sindent : string := (string<-indent indent) sid : string := (string<-propname-val "id" (:id h2))] (string sindent "<h2" sid ">" text "</h2>")) :doc "Returns string from h2") (func string<-h3-indent : string [h3 : h3 indent : int] (let [text : string := (:text h3) sindent : string := (string<-indent indent) sid : string := (string<-propname-val "id" (:id h3))] (string sindent "<h3" sid ">" text "</h3>")) :doc "Returns string from h3") (func string<-head-indent : string [head : head indent : int] (let [nodes : headchildlist := (:nodes head)] (string<-nodelist-tag-prop-indent nodes "head" "" indent) ) :test (test "<head></head>" (string<-head-indent (head) 0)) :doc "Returns string from head") (func string<-html : string [html : html] (let [lang : string := (string<-propname-val "lang" (:lang html)) head : head := (:head html) body : body := (:body html) footer : footer := (:footer html) shead : string := (string<-head-indent head 1) sbody : string := (string<-body-indent body 1) sfooter : string := (string<-footer-indent footer 1)] (string "<!DOCTYPE html>" newline "<html" lang ">" shead sbody sfooter newline "</html>")) :test (test "<!DOCTYPE html>\n<html>\n <head></head>\n <body></body>\n <footer></footer>\n</html>" (string<-html (html :head (head) :body (body)))) :doc "Returns string from html") (func string<-indent : string [indent : int] (if (= indent 0) "" (string newline (string-indent indent))) :doc "Returns a string to do indentation for a given indent count.") (func string<-meta-indent : string [meta : meta indent : int] (let [sindent : string := (string<-indent indent) charset : string := (string<-propname-val "charset" (:charset meta))] (string sindent "<meta" charset " />")) :test (test "<meta charset=\"utf-8\" />" (string<-meta-indent (meta :charset "utf-8") 0)) :doc "Returns string from head") (func string<-node-indent : string [node : any-1 indent : int] (switch (type<-any node) (case body (string<-body-indent (any<-any node) indent)) (case details (string<-details-indent (any<-any node) indent)) (case div (string<-div-indent (any<-any node) indent)) (case h1 (string<-h1-indent (any<-any node) indent)) (case h2 (string<-h2-indent (any<-any node) indent)) (case h3 (string<-h3-indent (any<-any node) indent)) (case head (string<-head-indent (any<-any node) indent)) (case footer (string<-footer-indent (any<-any node) indent)) (case meta (string<-meta-indent (any<-any node) indent)) (case p (string<-p-indent (any<-any node) indent)) (case stylesheet (string<-stylesheet-indent (any<-any node) indent)) (case table (string<-table-indent (any<-any node) indent)) (case title (string<-title-indent (any<-any node) indent)) (case tbody (string<-tbody-indent (any<-any node) indent)) (case thead (string<-thead-indent (any<-any node) indent)) (case td (string<-td-indent (any<-any node) indent)) (case tr (string<-tr-indent (any<-any node) indent)) ) :doc "Returns a string from any node") (func string<-nodelist-tag-prop-indent : string [nodes : list-1 tag : string prop : string indent : int] (let [text : string := (string<-nodelist-indent nodes (+1 indent)) sindent : string := (string<-indent indent) eindent : string := (if (then (is-empty text) "") (then (is-empty sindent) newline) (else sindent))] (string sindent "<" tag prop ">" text eindent "</" tag ">")) :doc "Returns string from generic nodelist") (func string<-nodelist-indent : string [nodelist : list-1 indent : int] (let [textlist : stringlist := (list<-list nodelist (fn : string [node : node] (string<-node-indent node indent) ))] (string<-stringlist-join textlist "")) :doc "Returns a string from any node") (func string<-p-indent : string [p : p indent : int] (let [sindent : string := (string<-indent indent) text : string := (htmlstring<-string (:text p)) sid : string := (string<-propname-val "id" (:id p)) sstyle : string := (string<-propstyle (:style p))] (string sindent "<p" sid sstyle ">" text "</p>")) :test (test "<p>data</p>" (string<-p-indent (p :text "data") 0)) (test "<p id=\"myid\">data</p>" (string<-p-indent (p :id "myid" :text "data") 0)) :doc "Returns string from p") (func string<-propname-val : string [key : string val : string] (if (!-empty val) (string " " key "=" quote val quote)) :doc "Returns ' key=\"val\"' if val is not blank.") (func string<-propstyle : string [style : style] (if (!-empty style) (string " class=" quote (string<-string-start (:name style) 2) quote)) :doc "Returns ' class=\"style.name\"' if style is not empty.") (func string<-style-indent : string [style : style indent : int] (let : string [sindent : string := (string<-indent indent) name : string := (:name style) propmap : propmap := (:props style) stext : string := (string<-stylepropmap-indent propmap (+1 indent))] (string sindent name " {" stext sindent "}" ) ) :doc "Returns indent'name {key: val;}' for each style.") (func string<-stylelist-indent : string [stylelist : stylelist indent : int] (let : string [sstyles : stringlist := (list<-list : stringlist stylelist (fn : string [substyle : style] (string<-style-indent substyle indent) ) )] (string<-stringlist-join sstyles "") ) :doc "Return a string from a stylelist") (func string<-stylepropmap-indent : string [propmap : propmap indent : int] (let : string [sindent : string := (string<-indent indent) sprops : stringlist := (list<-map : stringlist propmap (fn : string [key : string val : string] (string sindent key ": " val ";") ) )] (string<-stringlist-join sprops "") ) :doc "Returns indent'key: val;' for each prop.") (func string<-stylesheet-indent : string [stylesheet : stylesheet indent : int] (let [text : string := (string<-stylelist-indent (:styles stylesheet) (+1 indent)) sindent : string := (string<-indent indent) eindent : string := (if (!-empty text) sindent)] (string sindent "<style>" text eindent "</style>") ) :doc "Returns string representation of given stylesheet.") (func string<-table-indent : string [table : table indent : int] (let [sindent : string := (string<-indent indent) sid : string := (string<-propname-val "id" (:id table)) thead : thead := (:thead table) tbody : tbody := (:tbody table) shead : string := (string<-thead-indent thead (+1 indent)) sbody : string := (string<-tbody-indent tbody (+1 indent))] (string sindent "<table" sid ">" shead sbody sindent "</table>") ) :doc "Returns string from table") (func string<-tbody-indent : string [tbody : tbody indent : int] (let [nodes : trlist := (:nodes tbody)] (string<-nodelist-tag-prop-indent nodes "tbody" "" indent) ) :doc "Returns string from tbody") (func string<-td-indent : string [td : td indent : int] (let [nodes : divchildlist := (:nodes td)] (string<-nodelist-tag-prop-indent nodes "td" "" indent) ) :doc "Returns string from td") (func string<-thead-indent : string [thead : thead indent : int] (let [nodes : trlist := (:nodes thead)] (string<-nodelist-tag-prop-indent nodes "thead" "" indent) ) :doc "Returns string from thead") (func string<-title-indent : string [title : title indent : int] (let [sindent : string := (string<-indent indent) text : string := (:text title)] (string sindent "<title>" text "</title>")) :doc "Returns string from h2") (func string<-tr-indent : string [tr : tr indent : int] (let [nodes : tdlist := (:nodes tr)] (string<-nodelist-tag-prop-indent nodes "tr" "" indent) ) :doc "Returns string from tr") (func string<-uri : string [uri : string] (native :js "decodeURI(uri)") :doc "Decode a URI string") (func styles<-stylesheet : stylelist [stylesheet : stylesheet] (:styles stylesheet) :doc "Return style from stylesheet.stylemap") (func style<-stylesheet-name : style [stylesheet : stylesheet name : string] (any<-map (stylemap<-stylesheet stylesheet) name) :doc "Return style from stylesheet.stylemap") (func stylemap<-stylelist : stylemap [stylelist : stylelist] (map<-list : stylemap stylelist (fn : string [style : style] (:name style) ) ) :doc "Returns a stylemap from a given stylelist") (func stylemap<-stylesheet : stylemap [stylesheet : stylesheet] (:stylemap stylesheet) :doc "Return stylemap from stylesheet") (func stylesheet-loadmap : stylesheet [stylesheet : stylesheet] (copy stylesheet :stylemap (stylemap<-stylelist (:styles stylesheet))) :doc "Decode a URI string") (func uri<-string : string [text : string] (native :js "encodeURI(text)") :doc "Encode a URI string")
vx/web/html / body
Description:
  • Body Tag
Type Name:
  • body
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    nodes
    vx/web/html/divchildlist
    true
    true
Usage/Test Cases:
Source Code:
  • (type body : struct :properties [nodes : divchildlist :... :default] :doc "Body Tag")
vx/web/html / details
Description:
  • Details Tag
Type Name:
  • details
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    summary
    vx/web/html/divchildlist
    false
    false
    nodes
    vx/web/html/divchildlist
    false
    false
Usage/Test Cases:
Source Code:
  • (type details : struct :properties [summary : divchildlist nodes : divchildlist] :traits [node divchild] :doc "Details Tag")
vx/web/html / div
Description:
  • Div Tag
Type Name:
  • div
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    nodes
    vx/web/html/divchildlist
    true
    true
Usage/Test Cases:
Source Code:
  • (type div : struct :properties [nodes : divchildlist :... :default] :traits [node divchild] :doc "Div Tag")
vx/web/html / divchild
Description:
  • Div Child Trait
Type Name:
  • divchild
Extends:
  • :struct
Default:
Usage/Test Cases:
Source Code:
  • (type divchild : struct :doc "Div Child Trait")
vx/web/html / divchildlist
Description:
  • List of divchild
Type Name:
  • divchildlist
Extends:
  • :list
Default:
Allowed Types:
  • divchild
Usage/Test Cases:
Source Code:
  • (type divchildlist : list :allowtypes [divchild] :doc "List of divchild")
vx/web/html / divlist
Description:
  • List of div
Type Name:
  • divlist
Extends:
  • :list
Default:
Allowed Types:
  • div
Usage/Test Cases:
Source Code:
  • (type divlist : list :allowtypes [div] :doc "List of div")
vx/web/html / footer
Description:
  • Body Tag
Type Name:
  • footer
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    nodes
    vx/web/html/divchildlist
    true
    true
Usage/Test Cases:
Source Code:
  • (type footer : struct :properties [nodes : divchildlist :... :default] :doc "Body Tag")
vx/web/html / h1
Description:
  • Header 1 Tag
Type Name:
  • h1
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    text
    vx/core/string
    false
    true
Usage/Test Cases:
Source Code:
  • (type h1 : struct :properties [text : string :default] :traits [node divchild] :doc "Header 1 Tag")
vx/web/html / h2
Description:
  • Header 2 Tag
Type Name:
  • h2
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    text
    vx/core/string
    false
    true
Usage/Test Cases:
Source Code:
  • (type h2 : struct :properties [text : string :default] :traits [node divchild] :doc "Header 2 Tag")
vx/web/html / h3
Description:
  • Header 3 Tag
Type Name:
  • h3
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    text
    vx/core/string
    false
    true
Usage/Test Cases:
Source Code:
  • (type h3 : struct :properties [text : string :default] :traits [node divchild] :doc "Header 3 Tag")
vx/web/html / head
Description:
  • Head Tag
Type Name:
  • head
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    nodes
    vx/web/html/headchildlist
    true
    true
Usage/Test Cases:
Source Code:
  • (type head : struct :properties [nodes : headchildlist :... :default] :doc "Head Tag")
vx/web/html / headchild
Description:
  • Head Child Trait
Type Name:
  • headchild
Extends:
  • :struct
Default:
Usage/Test Cases:
Source Code:
  • (type headchild : struct :doc "Head Child Trait")
vx/web/html / headchildlist
Description:
  • List of headchild
Type Name:
  • headchildlist
Extends:
  • :list
Default:
Allowed Types:
  • headchild
Usage/Test Cases:
Source Code:
  • (type headchildlist : list :allowtypes [headchild] :doc "List of headchild")
vx/web/html / html
Description:
  • Html Tag
Type Name:
  • html
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    lang
    vx/core/string
    false
    false
    head
    vx/web/html/head
    false
    false
    body
    vx/web/html/body
    false
    false
    footer
    vx/web/html/footer
    false
    false
Usage/Test Cases:
Source Code:
  • (type html : struct :properties [lang : string head : head body : body footer : footer] :doc "Html Tag")
vx/web/html / meta
Description:
  • Meta Tag
Type Name:
  • meta
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    charset
    vx/core/string
    false
    false
Usage/Test Cases:
Source Code:
  • (type meta : struct :properties [charset : string] :traits [node headchild] :doc "Meta Tag")
vx/web/html / node
Description:
  • Common Html Node Trait
Type Name:
  • node
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    id
    vx/core/string
    false
    false
    style
    vx/web/html/style
    false
    false
Usage/Test Cases:
Source Code:
  • (type node : struct :properties [id : string style : style] :doc "Common Html Node Trait")
vx/web/html / nodelist
Description:
  • List of node
Type Name:
  • nodelist
Extends:
  • :list
Default:
Allowed Types:
  • node
Usage/Test Cases:
Source Code:
  • (type nodelist : list :allowtypes [node] :doc "List of node")
vx/web/html / p
Description:
  • Paragraph Tag
Type Name:
  • p
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    text
    vx/core/string
    false
    true
Usage/Test Cases:
Source Code:
  • (type p : struct :properties [text : string :default] :traits [node divchild] :doc "Paragraph Tag")
vx/web/html / propmap
Description:
  • Map of props
Type Name:
  • propmap
Extends:
  • :map
Default:
Allowed Types:
  • string
Usage/Test Cases:
Source Code:
  • (type propmap : map :allowtypes [string] :doc "Map of props")
vx/web/html / style
Description:
  • Programmable Cascading Style
Type Name:
  • style
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    name
    vx/core/string
    false
    false
    props
    vx/web/html/propmap
    false
    false
Usage/Test Cases:
Source Code:
  • (type style : struct :properties [name : string props : propmap] :doc "Programmable Cascading Style")
vx/web/html / stylelist
Description:
  • List of style
Type Name:
  • stylelist
Extends:
  • :list
Default:
Allowed Types:
  • style
Usage/Test Cases:
Source Code:
  • (type stylelist : list :allowtypes [style] :doc "List of style")
vx/web/html / stylemap
Description:
  • Map of style
Type Name:
  • stylemap
Extends:
  • :map
Default:
Allowed Types:
  • style
Usage/Test Cases:
Source Code:
  • (type stylemap : map :allowtypes [style] :doc "Map of style")
vx/web/html / stylesheet
Description:
  • Programmable Cascading Style Sheet CSS type
Type Name:
  • stylesheet
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    name
    vx/core/string
    false
    false
    styles
    vx/web/html/stylelist
    false
    false
    stylemap
    vx/web/html/stylemap
    false
    false
Usage/Test Cases:
Source Code:
  • (type stylesheet : struct :properties [name : string styles : stylelist stylemap : stylemap] :traits [node headchild] :doc "Programmable Cascading Style Sheet CSS type")
vx/web/html / table
Description:
  • <table> Tag
Type Name:
  • table
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    tbody
    vx/web/html/tbody
    false
    false
    thead
    vx/web/html/thead
    false
    false
Usage/Test Cases:
Source Code:
  • (type table : struct :properties [tbody : tbody thead : thead] :traits [node divchild] :doc "<table> Tag")
vx/web/html / tbody
Description:
  • <tbody> Tag
Type Name:
  • tbody
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    nodes
    vx/web/html/trlist
    true
    true
Usage/Test Cases:
Source Code:
  • (type tbody : struct :properties [nodes : trlist :default :...] :traits [node] :doc "<tbody> Tag")
vx/web/html / td
Description:
  • <tr> Tag
Type Name:
  • td
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    nodes
    vx/web/html/divchildlist
    true
    true
Usage/Test Cases:
Source Code:
  • (type td : struct :properties [nodes : divchildlist :default :...] :traits [node] :doc "<tr> Tag")
vx/web/html / tdlist
Description:
  • List of td
Type Name:
  • tdlist
Extends:
  • :list
Default:
Allowed Types:
  • td
Usage/Test Cases:
Source Code:
  • (type tdlist : list :allowtypes [td] :doc "List of td")
vx/web/html / thead
Description:
  • <thead> Tag
Type Name:
  • thead
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    nodes
    vx/web/html/trlist
    true
    true
Usage/Test Cases:
Source Code:
  • (type thead : struct :properties [nodes : trlist :default :...] :traits [node] :doc "<thead> Tag")
vx/web/html / title
Description:
  • Title Tag
Type Name:
  • title
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    text
    vx/core/string
    false
    false
Usage/Test Cases:
Source Code:
  • (type title : struct :properties [text : string] :traits [node headchild] :doc "Title Tag")
vx/web/html / tr
Description:
  • <tr> Tag
Type Name:
  • tr
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    nodes
    vx/web/html/tdlist
    true
    true
Usage/Test Cases:
Source Code:
  • (type tr : struct :properties [nodes : tdlist :default :...] :traits [node] :doc "<tr> Tag")
vx/web/html / trlist
Description:
  • List of tr
Type Name:
  • trlist
Extends:
  • :list
Default:
Allowed Types:
  • tr
Usage/Test Cases:
Source Code:
  • (type trlist : list :allowtypes [tr] :doc "List of tr")
vx/web/html / htmlstring<-string
Description:
  • Convert text to HTML string
Function Name:
  • htmlstring<-string
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func htmlstring<-string : string [text : string] (native :cpp "std::string str = text->vx_string(); str = vx_core::vx_string_from_string_find_replace(str, “&”, “&amp;”); str = vx_core::vx_string_from_string_find_replace(str, “'”, “\'”); str = vx_core::vx_string_from_string_find_replace(str, “>”, “&gt;”); str = vx_core::vx_string_from_string_find_replace(str, “<”, “&lt;”); output = vx_core::vx_new_string(str);" :js "const str = “” + text output = str .replace(/&/g, “&amp;”) .replace(/'/g, “\'”) .replace(/>/g, “&gt;”) .replace(/</g, “&lt;”)" :java "String str = text.vx_string(); str = str .replaceAll(“&”, “&amp;”) .replaceAll(“'”, “\'”) .replaceAll(“>”, “&gt;”) .replaceAll(“<”, “&lt;”); output = Core.vx_new_string(str);") :doc "Convert text to HTML string")
vx/web/html / string-indent
Description:
Function Name:
  • string-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    indent
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func string-indent : string [indent : int] (string-repeat " " indent))
vx/web/html / string<-div-indent
Description:
  • Returns string from div
Function Name:
  • string<-div-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    div
    vx/web/html/div
    indent
    vx/core/int
Usage/Test Cases:
  • (test "<div></div>" (string<-div-indent (div) 0))
  • (test "<div id=\"myid\"></div>" (string<-div-indent (div :id "myid") 0))
Source Code:
  • (func string<-div-indent : string [div : div indent : int] (let [nodes : divchildlist := (:nodes div) sid : string := (string<-propname-val "id" (:id div)) sstyle : string := (string<-propstyle (:style div))] (string<-nodelist-tag-prop-indent nodes "div" (string sid sstyle) indent) ) :test (test "<div></div>" (string<-div-indent (div) 0)) (test "<div id=\"myid\"></div>" (string<-div-indent (div :id "myid") 0)) :doc "Returns string from div")
vx/web/html / string<-body-indent
Description:
  • Returns string from body
Function Name:
  • string<-body-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    body
    vx/web/html/body
    indent
    vx/core/int
Usage/Test Cases:
  • (test "<body></body>" (string<-body-indent (body) 0))
  • (test "<body>\n <div></div>\n</body>" (string<-body-indent (body (div)) 0))
Source Code:
  • (func string<-body-indent : string [body : body indent : int] (let [nodes : divchildlist := (:nodes body)] (string<-nodelist-tag-prop-indent nodes "body" "" indent) ) :test (test "<body></body>" (string<-body-indent (body) 0)) (test "<body>\n <div></div>\n</body>" (string<-body-indent (body (div)) 0)) :doc "Returns string from body")
vx/web/html / string<-details-indent
Description:
  • Returns string from details
Function Name:
  • string<-details-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    details
    vx/web/html/details
    indent
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func string<-details-indent : string [details : details indent : int] (let [sindent : string := (string<-indent indent) summary : divchildlist := (:summary details) nodes : divchildlist := (:nodes details) ssummary : string := (string<-nodelist-indent summary (+ indent 2)) snodes : string := (string<-nodelist-indent nodes (+ indent 1))] (string sindent "<details>" sindent " <summary>" ssummary sindent " </summary>" snodes sindent "</details>") ) :doc "Returns string from details")
vx/web/html / string<-h1-indent
Description:
  • Returns string from h1
Function Name:
  • string<-h1-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    h1
    vx/web/html/h1
    indent
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func string<-h1-indent : string [h1 : h1 indent : int] (let [sindent : string := (string<-indent indent) text : string := (:text h1) sid : string := (string<-propname-val "id" (:id h1))] (string sindent "<h1" sid ">" text "</h1>")) :doc "Returns string from h1")
vx/web/html / string<-h2-indent
Description:
  • Returns string from h2
Function Name:
  • string<-h2-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    h2
    vx/web/html/h2
    indent
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func string<-h2-indent : string [h2 : h2 indent : int] (let [text : string := (:text h2) sindent : string := (string<-indent indent) sid : string := (string<-propname-val "id" (:id h2))] (string sindent "<h2" sid ">" text "</h2>")) :doc "Returns string from h2")
vx/web/html / string<-h3-indent
Description:
  • Returns string from h3
Function Name:
  • string<-h3-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    h3
    vx/web/html/h3
    indent
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func string<-h3-indent : string [h3 : h3 indent : int] (let [text : string := (:text h3) sindent : string := (string<-indent indent) sid : string := (string<-propname-val "id" (:id h3))] (string sindent "<h3" sid ">" text "</h3>")) :doc "Returns string from h3")
vx/web/html / string<-head-indent
Description:
  • Returns string from head
Function Name:
  • string<-head-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    head
    vx/web/html/head
    indent
    vx/core/int
Usage/Test Cases:
  • (test "<head></head>" (string<-head-indent (head) 0))
Source Code:
  • (func string<-head-indent : string [head : head indent : int] (let [nodes : headchildlist := (:nodes head)] (string<-nodelist-tag-prop-indent nodes "head" "" indent) ) :test (test "<head></head>" (string<-head-indent (head) 0)) :doc "Returns string from head")
vx/web/html / string<-html
Description:
  • Returns string from html
Function Name:
  • string<-html
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    html
    vx/web/html/html
Usage/Test Cases:
  • (test "<!DOCTYPE html>\n<html>\n <head></head>\n <body></body>\n <footer></footer>\n</html>" (string<-html (html :head (head) :body (body))))
Source Code:
  • (func string<-html : string [html : html] (let [lang : string := (string<-propname-val "lang" (:lang html)) head : head := (:head html) body : body := (:body html) footer : footer := (:footer html) shead : string := (string<-head-indent head 1) sbody : string := (string<-body-indent body 1) sfooter : string := (string<-footer-indent footer 1)] (string "<!DOCTYPE html>" newline "<html" lang ">" shead sbody sfooter newline "</html>")) :test (test "<!DOCTYPE html>\n<html>\n <head></head>\n <body></body>\n <footer></footer>\n</html>" (string<-html (html :head (head) :body (body)))) :doc "Returns string from html")
vx/web/html / string<-indent
Description:
  • Returns a string to do indentation for a given indent count.
Function Name:
  • string<-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    indent
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func string<-indent : string [indent : int] (if (= indent 0) "" (string newline (string-indent indent))) :doc "Returns a string to do indentation for a given indent count.")
vx/web/html / string<-meta-indent
Description:
  • Returns string from head
Function Name:
  • string<-meta-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    meta
    vx/web/html/meta
    indent
    vx/core/int
Usage/Test Cases:
  • (test "<meta charset=\"utf-8\" />" (string<-meta-indent (meta :charset "utf-8") 0))
Source Code:
  • (func string<-meta-indent : string [meta : meta indent : int] (let [sindent : string := (string<-indent indent) charset : string := (string<-propname-val "charset" (:charset meta))] (string sindent "<meta" charset " />")) :test (test "<meta charset=\"utf-8\" />" (string<-meta-indent (meta :charset "utf-8") 0)) :doc "Returns string from head")
vx/web/html / string<-node-indent
Description:
  • Returns a string from any node
Function Name:
  • string<-node-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    node
    vx/core/any-1
    indent
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func string<-node-indent : string [node : any-1 indent : int] (switch (type<-any node) (case body (string<-body-indent (any<-any node) indent)) (case details (string<-details-indent (any<-any node) indent)) (case div (string<-div-indent (any<-any node) indent)) (case h1 (string<-h1-indent (any<-any node) indent)) (case h2 (string<-h2-indent (any<-any node) indent)) (case h3 (string<-h3-indent (any<-any node) indent)) (case head (string<-head-indent (any<-any node) indent)) (case footer (string<-footer-indent (any<-any node) indent)) (case meta (string<-meta-indent (any<-any node) indent)) (case p (string<-p-indent (any<-any node) indent)) (case stylesheet (string<-stylesheet-indent (any<-any node) indent)) (case table (string<-table-indent (any<-any node) indent)) (case title (string<-title-indent (any<-any node) indent)) (case tbody (string<-tbody-indent (any<-any node) indent)) (case thead (string<-thead-indent (any<-any node) indent)) (case td (string<-td-indent (any<-any node) indent)) (case tr (string<-tr-indent (any<-any node) indent)) ) :doc "Returns a string from any node")
vx/web/html / string<-nodelist-tag-prop-indent
Description:
  • Returns string from generic nodelist
Function Name:
  • string<-nodelist-tag-prop-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    nodes
    vx/core/list-1
    tag
    vx/core/string
    prop
    vx/core/string
    indent
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func string<-nodelist-tag-prop-indent : string [nodes : list-1 tag : string prop : string indent : int] (let [text : string := (string<-nodelist-indent nodes (+1 indent)) sindent : string := (string<-indent indent) eindent : string := (if (then (is-empty text) "") (then (is-empty sindent) newline) (else sindent))] (string sindent "<" tag prop ">" text eindent "</" tag ">")) :doc "Returns string from generic nodelist")
vx/web/html / string<-nodelist-indent
Description:
  • Returns a string from any node
Function Name:
  • string<-nodelist-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    nodelist
    vx/core/list-1
    indent
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func string<-nodelist-indent : string [nodelist : list-1 indent : int] (let [textlist : stringlist := (list<-list nodelist (fn : string [node : node] (string<-node-indent node indent) ))] (string<-stringlist-join textlist "")) :doc "Returns a string from any node")
vx/web/html / string<-p-indent
Description:
  • Returns string from p
Function Name:
  • string<-p-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    p
    vx/web/html/p
    indent
    vx/core/int
Usage/Test Cases:
  • (test "<p>data</p>" (string<-p-indent (p :text "data") 0))
  • (test "<p id=\"myid\">data</p>" (string<-p-indent (p :id "myid" :text "data") 0))
Source Code:
  • (func string<-p-indent : string [p : p indent : int] (let [sindent : string := (string<-indent indent) text : string := (htmlstring<-string (:text p)) sid : string := (string<-propname-val "id" (:id p)) sstyle : string := (string<-propstyle (:style p))] (string sindent "<p" sid sstyle ">" text "</p>")) :test (test "<p>data</p>" (string<-p-indent (p :text "data") 0)) (test "<p id=\"myid\">data</p>" (string<-p-indent (p :id "myid" :text "data") 0)) :doc "Returns string from p")
vx/web/html / string<-propname-val
Description:
  • Returns ' key=\"val\"' if val is not blank.
Function Name:
  • string<-propname-val
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    key
    vx/core/string
    val
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func string<-propname-val : string [key : string val : string] (if (!-empty val) (string " " key "=" quote val quote)) :doc "Returns ' key=\"val\"' if val is not blank.")
vx/web/html / string<-propstyle
Description:
  • Returns ' class=\"style.name\"' if style is not empty.
Function Name:
  • string<-propstyle
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    style
    vx/web/html/style
Usage/Test Cases:
Source Code:
  • (func string<-propstyle : string [style : style] (if (!-empty style) (string " class=" quote (string<-string-start (:name style) 2) quote)) :doc "Returns ' class=\"style.name\"' if style is not empty.")
vx/web/html / string<-style-indent
Description:
  • Returns indent'name {key: val;}' for each style.
Function Name:
  • string<-style-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    style
    vx/web/html/style
    indent
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func string<-style-indent : string [style : style indent : int] (let : string [sindent : string := (string<-indent indent) name : string := (:name style) propmap : propmap := (:props style) stext : string := (string<-stylepropmap-indent propmap (+1 indent))] (string sindent name " {" stext sindent "}" ) ) :doc "Returns indent'name {key: val;}' for each style.")
vx/web/html / string<-stylelist-indent
Description:
  • Return a string from a stylelist
Function Name:
  • string<-stylelist-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    stylelist
    vx/web/html/stylelist
    indent
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func string<-stylelist-indent : string [stylelist : stylelist indent : int] (let : string [sstyles : stringlist := (list<-list : stringlist stylelist (fn : string [substyle : style] (string<-style-indent substyle indent) ) )] (string<-stringlist-join sstyles "") ) :doc "Return a string from a stylelist")
vx/web/html / string<-stylepropmap-indent
Description:
  • Returns indent'key: val;' for each prop.
Function Name:
  • string<-stylepropmap-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    propmap
    vx/web/html/propmap
    indent
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func string<-stylepropmap-indent : string [propmap : propmap indent : int] (let : string [sindent : string := (string<-indent indent) sprops : stringlist := (list<-map : stringlist propmap (fn : string [key : string val : string] (string sindent key ": " val ";") ) )] (string<-stringlist-join sprops "") ) :doc "Returns indent'key: val;' for each prop.")
vx/web/html / string<-stylesheet-indent
Description:
  • Returns string representation of given stylesheet.
Function Name:
  • string<-stylesheet-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    stylesheet
    vx/web/html/stylesheet
    indent
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func string<-stylesheet-indent : string [stylesheet : stylesheet indent : int] (let [text : string := (string<-stylelist-indent (:styles stylesheet) (+1 indent)) sindent : string := (string<-indent indent) eindent : string := (if (!-empty text) sindent)] (string sindent "<style>" text eindent "</style>") ) :doc "Returns string representation of given stylesheet.")
vx/web/html / string<-table-indent
Description:
  • Returns string from table
Function Name:
  • string<-table-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    table
    vx/web/html/table
    indent
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func string<-table-indent : string [table : table indent : int] (let [sindent : string := (string<-indent indent) sid : string := (string<-propname-val "id" (:id table)) thead : thead := (:thead table) tbody : tbody := (:tbody table) shead : string := (string<-thead-indent thead (+1 indent)) sbody : string := (string<-tbody-indent tbody (+1 indent))] (string sindent "<table" sid ">" shead sbody sindent "</table>") ) :doc "Returns string from table")
vx/web/html / string<-tbody-indent
Description:
  • Returns string from tbody
Function Name:
  • string<-tbody-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    tbody
    vx/web/html/tbody
    indent
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func string<-tbody-indent : string [tbody : tbody indent : int] (let [nodes : trlist := (:nodes tbody)] (string<-nodelist-tag-prop-indent nodes "tbody" "" indent) ) :doc "Returns string from tbody")
vx/web/html / string<-td-indent
Description:
  • Returns string from td
Function Name:
  • string<-td-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    td
    vx/web/html/td
    indent
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func string<-td-indent : string [td : td indent : int] (let [nodes : divchildlist := (:nodes td)] (string<-nodelist-tag-prop-indent nodes "td" "" indent) ) :doc "Returns string from td")
vx/web/html / string<-thead-indent
Description:
  • Returns string from thead
Function Name:
  • string<-thead-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    thead
    vx/web/html/thead
    indent
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func string<-thead-indent : string [thead : thead indent : int] (let [nodes : trlist := (:nodes thead)] (string<-nodelist-tag-prop-indent nodes "thead" "" indent) ) :doc "Returns string from thead")
vx/web/html / string<-title-indent
Description:
  • Returns string from h2
Function Name:
  • string<-title-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    title
    vx/web/html/title
    indent
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func string<-title-indent : string [title : title indent : int] (let [sindent : string := (string<-indent indent) text : string := (:text title)] (string sindent "<title>" text "</title>")) :doc "Returns string from h2")
vx/web/html / string<-tr-indent
Description:
  • Returns string from tr
Function Name:
  • string<-tr-indent
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    tr
    vx/web/html/tr
    indent
    vx/core/int
Usage/Test Cases:
Source Code:
  • (func string<-tr-indent : string [tr : tr indent : int] (let [nodes : tdlist := (:nodes tr)] (string<-nodelist-tag-prop-indent nodes "tr" "" indent) ) :doc "Returns string from tr")
vx/web/html / string<-uri
Description:
  • Decode a URI string
Function Name:
  • string<-uri
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    uri
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func string<-uri : string [uri : string] (native :js "decodeURI(uri)") :doc "Decode a URI string")
vx/web/html / styles<-stylesheet
Description:
  • Return style from stylesheet.stylemap
Function Name:
  • styles<-stylesheet
Return Type:
  • vx/web/html/stylelist
Arguments:
  • Name
    Type
    Generic
    Description
    stylesheet
    vx/web/html/stylesheet
Usage/Test Cases:
Source Code:
  • (func styles<-stylesheet : stylelist [stylesheet : stylesheet] (:styles stylesheet) :doc "Return style from stylesheet.stylemap")
vx/web/html / style<-stylesheet-name
Description:
  • Return style from stylesheet.stylemap
Function Name:
  • style<-stylesheet-name
Return Type:
  • vx/web/html/style
Arguments:
  • Name
    Type
    Generic
    Description
    stylesheet
    vx/web/html/stylesheet
    name
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func style<-stylesheet-name : style [stylesheet : stylesheet name : string] (any<-map (stylemap<-stylesheet stylesheet) name) :doc "Return style from stylesheet.stylemap")
vx/web/html / stylemap<-stylelist
Description:
  • Returns a stylemap from a given stylelist
Function Name:
  • stylemap<-stylelist
Return Type:
  • vx/web/html/stylemap
Arguments:
  • Name
    Type
    Generic
    Description
    stylelist
    vx/web/html/stylelist
Usage/Test Cases:
Source Code:
  • (func stylemap<-stylelist : stylemap [stylelist : stylelist] (map<-list : stylemap stylelist (fn : string [style : style] (:name style) ) ) :doc "Returns a stylemap from a given stylelist")
vx/web/html / stylemap<-stylesheet
Description:
  • Return stylemap from stylesheet
Function Name:
  • stylemap<-stylesheet
Return Type:
  • vx/web/html/stylemap
Arguments:
  • Name
    Type
    Generic
    Description
    stylesheet
    vx/web/html/stylesheet
Usage/Test Cases:
Source Code:
  • (func stylemap<-stylesheet : stylemap [stylesheet : stylesheet] (:stylemap stylesheet) :doc "Return stylemap from stylesheet")
vx/web/html / stylesheet-loadmap
Description:
  • Decode a URI string
Function Name:
  • stylesheet-loadmap
Return Type:
  • vx/web/html/stylesheet
Arguments:
  • Name
    Type
    Generic
    Description
    stylesheet
    vx/web/html/stylesheet
Usage/Test Cases:
Source Code:
  • (func stylesheet-loadmap : stylesheet [stylesheet : stylesheet] (copy stylesheet :stylemap (stylemap<-stylelist (:styles stylesheet))) :doc "Decode a URI string")
vx/web/html / uri<-string
Description:
  • Encode a URI string
Function Name:
  • uri<-string
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    text
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func uri<-string : string [text : string] (native :js "encodeURI(text)") :doc "Encode a URI string")
vx/web/htmldoc
Description:
  • Html Client-side document handler
Package Name:
  • vx/web/htmldoc
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    html
    vx/web/html
Types:
Constants:
Functions:
  • boolean-write<-id-htmltext, boolean-write<-stylesheet, string<-id
Source Code:
  • (package vx/web/htmldoc :libs (lib html :path vx/web/html) :doc "Html Client-side document handler") (func boolean-write<-id-htmltext : boolean [id : string htmltext : string] (native :js "const elem = document.getElementById(id) if (elem != null) { elem.innerHTML = htmltext output = vx_core.c_true }") :sideeffects "Changes HTML display." :clientserver :client :doc "Writes to an html node with given id and text.") (func boolean-write<-stylesheet : boolean [stylesheet : html/stylesheet] (native :js "const stylelist = vx_web_html.f_styles_from_stylesheet(stylesheet) const text = vx_web_html.f_string_from_stylelist_indent(stylelist, 0) const cssstylesheet = new CSSStyleSheet() document.adoptedStyleSheets = [cssstylesheet] output = await cssstylesheet.replace(text)") :async :sideeffects "Changes Stylesheet display." :clientserver :client :doc "Writes to an html node with given id and text.") (func string<-id : string [id : string] (native :js "const elem = document.getElementById(id) if (!elem) { } else if (elem.value) { output = elem.value } else if (elem.value) { output = elem.innerHTML }") :clientserver :client :doc "Reads the value of an html node by id.")
vx/web/htmldoc / boolean-write<-id-htmltext
Description:
  • Writes to an html node with given id and text.
Function Name:
  • boolean-write<-id-htmltext
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    id
    vx/core/string
    htmltext
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func boolean-write<-id-htmltext : boolean [id : string htmltext : string] (native :js "const elem = document.getElementById(id) if (elem != null) { elem.innerHTML = htmltext output = vx_core.c_true }") :sideeffects "Changes HTML display." :clientserver :client :doc "Writes to an html node with given id and text.")
vx/web/htmldoc / boolean-write<-stylesheet
Description:
  • Writes to an html node with given id and text.
Function Name:
  • boolean-write<-stylesheet
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    stylesheet
    vx/web/html/stylesheet
Usage/Test Cases:
Source Code:
  • (func boolean-write<-stylesheet : boolean [stylesheet : html/stylesheet] (native :js "const stylelist = vx_web_html.f_styles_from_stylesheet(stylesheet) const text = vx_web_html.f_string_from_stylelist_indent(stylelist, 0) const cssstylesheet = new CSSStyleSheet() document.adoptedStyleSheets = [cssstylesheet] output = await cssstylesheet.replace(text)") :async :sideeffects "Changes Stylesheet display." :clientserver :client :doc "Writes to an html node with given id and text.")
vx/web/htmldoc / string<-id
Description:
  • Reads the value of an html node by id.
Function Name:
  • string<-id
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    id
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func string<-id : string [id : string] (native :js "const elem = document.getElementById(id) if (!elem) { } else if (elem.value) { output = elem.value } else if (elem.value) { output = elem.innerHTML }") :clientserver :client :doc "Reads the value of an html node by id.")
vx/web/http
Description:
  • Http library
Package Name:
  • vx/web/http
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    csv
    vx/data/csv
    tb
    vx/data/textblock
    xml
    vx/data/xml
    javafuture
    java.util.concurrent.CompletableFuture
Types:
  • response
Constants:
Functions:
  • csv<-httpget, json<-httpget, response<-httpget, text<-httpget, text<-response, textblock<-httpget, textblock<-response, xml<-httpget
Source Code:
  • (package vx/web/http :libs (lib csv :path vx/data/csv) (lib tb :path vx/data/textblock) (lib xml :path vx/data/xml) (lib javafuture) :doc "Http library") (type response : struct :properties [ok : boolean status : int]) (func csv<-httpget : csv :async [url : string] (let [textblock : tb/textblock := (textblock<-httpget url "text/csv")] (csv/csv<-textblock textblock)) :clientserver :client :doc "Returns a csv file from an httpget") (func json<-httpget : response :async [url : string] (let [response : response := (response<-httpget url "application/json")] response) :clientserver :client :doc "Returns a json response from an httpget") (func response<-httpget : response :async [url : string contenttype : string] (native :js "fetch(url, {mode: 'no-cors', method: 'GET', headers: { 'Content-Type': contenttype }})") :clientserver :client :doc "Returns a response from an httpget") (func text<-httpget : string :async [url : string] (let [response : response := (response<-httpget url "text/plain")] (text<-response response)) :clientserver :client :doc "Returns string from an httpget") (func text<-response : string [response : response] (native :js "response.text()") :clientserver :client :doc "Returns a string from a response") (func textblock<-httpget : tb/textblock :async [url : string contenttype : string] (let [response : response := (response<-httpget url contenttype)] (textblock<-response response)) :clientserver :client :doc "Returns a textblock from an httpget") (func textblock<-response : tb/textblock [response : response] (tb/textblock :text (text<-response response)) :clientserver :client :doc "Returns a textblock from a response") (func xml<-httpget : xml :async [url : string] (let [textblock : tb/textblock := (textblock<-httpget url "text/xml")] (xml/xml<-textblock textblock)) :clientserver :client :doc "Return Xml from an httpget")
vx/web/http / response
Description:
Type Name:
  • response
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    ok
    vx/core/boolean
    false
    false
    status
    vx/core/int
    false
    false
Usage/Test Cases:
Source Code:
  • (type response : struct :properties [ok : boolean status : int])
vx/web/http / csv<-httpget
Description:
  • Returns a csv file from an httpget
Function Name:
  • csv<-httpget
Return Type:
  • vx/data/csv/csv
Arguments:
  • Name
    Type
    Generic
    Description
    url
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func csv<-httpget : csv :async [url : string] (let [textblock : tb/textblock := (textblock<-httpget url "text/csv")] (csv/csv<-textblock textblock)) :clientserver :client :doc "Returns a csv file from an httpget")
vx/web/http / json<-httpget
Description:
  • Returns a json response from an httpget
Function Name:
  • json<-httpget
Return Type:
  • vx/web/http/response
Arguments:
  • Name
    Type
    Generic
    Description
    url
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func json<-httpget : response :async [url : string] (let [response : response := (response<-httpget url "application/json")] response) :clientserver :client :doc "Returns a json response from an httpget")
vx/web/http / response<-httpget
Description:
  • Returns a response from an httpget
Function Name:
  • response<-httpget
Return Type:
  • vx/web/http/response
Arguments:
  • Name
    Type
    Generic
    Description
    url
    vx/core/string
    contenttype
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func response<-httpget : response :async [url : string contenttype : string] (native :js "fetch(url, {mode: 'no-cors', method: 'GET', headers: { 'Content-Type': contenttype }})") :clientserver :client :doc "Returns a response from an httpget")
vx/web/http / text<-httpget
Description:
  • Returns string from an httpget
Function Name:
  • text<-httpget
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    url
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func text<-httpget : string :async [url : string] (let [response : response := (response<-httpget url "text/plain")] (text<-response response)) :clientserver :client :doc "Returns string from an httpget")
vx/web/http / text<-response
Description:
  • Returns a string from a response
Function Name:
  • text<-response
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    response
    vx/web/http/response
Usage/Test Cases:
Source Code:
  • (func text<-response : string [response : response] (native :js "response.text()") :clientserver :client :doc "Returns a string from a response")
vx/web/http / textblock<-httpget
Description:
  • Returns a textblock from an httpget
Function Name:
  • textblock<-httpget
Return Type:
  • vx/data/textblock/textblock
Arguments:
  • Name
    Type
    Generic
    Description
    url
    vx/core/string
    contenttype
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func textblock<-httpget : tb/textblock :async [url : string contenttype : string] (let [response : response := (response<-httpget url contenttype)] (textblock<-response response)) :clientserver :client :doc "Returns a textblock from an httpget")
vx/web/http / textblock<-response
Description:
  • Returns a textblock from a response
Function Name:
  • textblock<-response
Return Type:
  • vx/data/textblock/textblock
Arguments:
  • Name
    Type
    Generic
    Description
    response
    vx/web/http/response
Usage/Test Cases:
Source Code:
  • (func textblock<-response : tb/textblock [response : response] (tb/textblock :text (text<-response response)) :clientserver :client :doc "Returns a textblock from a response")
vx/web/http / xml<-httpget
Description:
  • Return Xml from an httpget
Function Name:
  • xml<-httpget
Return Type:
  • vx/data/xml/xml
Arguments:
  • Name
    Type
    Generic
    Description
    url
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func xml<-httpget : xml :async [url : string] (let [textblock : tb/textblock := (textblock<-httpget url "text/xml")] (xml/xml<-textblock textblock)) :clientserver :client :doc "Return Xml from an httpget")
nx/crypto/cryptosheet
Description:
Package Name:
  • nx/crypto/cryptosheet
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
Types:
Constants:
Functions:
Source Code:
  • (package nx/crypto/cryptosheet)
nx/tactics/apptactics
Description:
  • Main App for NxTactics
Package Name:
  • nx/tactics/apptactics
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
    bl
    nx/tactics/books/bookloader
    fil
    vx/data/file
    xml
    vx/data/xml
Types:
Constants:
Functions:
  • main-nx, context-nx, security-nx
Source Code:
  • (package nx/tactics/apptactics :libs (lib base :path nx/tactics/base) (lib bl :path nx/tactics/books/bookloader) (lib fil :path vx/data/file) (lib xml :path vx/data/xml) :doc "Main App for NxTactics") (func main-nx : string [args : anylist :...] (let [booknames : stringlist := (stringlist //"TACTICSBOOK_CORE" //"TACTICSBOOK_ADVANCED" "TACTICSBOOK_ANCIENT" //"TACTICSBOOK_AOSAIL" //"TACTICSBOOK_AOSTEAM" //"TACTICSBOOK_BESTIARY" //"TACTICSBOOK_CHARS" //"TACTICSBOOK_COMBAT" "TACTICSBOOK_FANTASY" //"TACTICSBOOK_GEAR" //"TACTICSBOOK_GIANT" "TACTICSBOOK_HIGHTECH" //"TACTICSBOOK_HORROR" //"TACTICSBOOK_LANDSEA" //"TACTICSBOOK_MAGIC" //"TACTICSBOOK_MEDIEVAL" //"TACTICSBOOK_MFANTASY" //"TACTICSBOOK_MODERN" "TACTICSBOOK_POWERS" //"TACTICSBOOK_PREHISTORY" //"TACTICSBOOK_PULP" //"TACTICSBOOK_SCIFI" //"TACTICSBOOK_SKILLS" //"TACTICSBOOK_SPACE" //"TACTICSBOOK_SUPER" "TACTICSBOOK_WORLDWARS") done : boolean := (bl/boolean-write<-booknames booknames)] (string<-any done)) :context :doc "The default function for app main execution. Arguments come from the command line.") /* (func main-nx : string [args : anylist :...] (let [book : base/book := (bl/book-read<-bookname "TACTICSBOOK_WORLDWARS") done : boolean := (bl/boolean-write<-book book)] (string<-any done)) :context :doc "The default function for app main execution. Arguments come from the command line.") (func main-nx : string [args : anylist :...] (let [book : base/book := (bl/book-read<-bookname "TACTICSBOOK_CORE")] (string<-any book)) :context :doc "The default function for app main execution. Arguments come from the command line.") (func main-nx : string [args : anylist :...] (let [xml : xml/xml := (bl/xml-read<-bookname "TACTICSBOOK_SKILLS")] (string<-any xml)) :context :doc "The default function for app main execution. Arguments come from the command line.") (func main-nx : string [args : anylist :...] (bl/string-read<-bookname "TACTICSBOOK_BESTIARY") :context :doc "The default function for app main execution. Arguments come from the command line.") */ (func context-nx : context [args : anylist :...] (context :session (session :user (user :security (security-nx)))) :doc "Returns the context for execution. Arguments come from the command line.") (func security-nx : security (security :allowfuncs (funclist fil/boolean-write<-file-any fil/boolean-write<-file-string fil/file-read<-file fil/string-read<-file)) :doc "Returns the security for execution.")
nx/tactics/apptactics / main-nx
Description:
  • The default function for app main execution. Arguments come from the command line.
Function Name:
  • main-nx
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    args
    vx/core/anylist
Usage/Test Cases:
Source Code:
  • (func main-nx : string [args : anylist :...] (let [booknames : stringlist := (stringlist //"TACTICSBOOK_CORE" //"TACTICSBOOK_ADVANCED" "TACTICSBOOK_ANCIENT" //"TACTICSBOOK_AOSAIL" //"TACTICSBOOK_AOSTEAM" //"TACTICSBOOK_BESTIARY" //"TACTICSBOOK_CHARS" //"TACTICSBOOK_COMBAT" "TACTICSBOOK_FANTASY" //"TACTICSBOOK_GEAR" //"TACTICSBOOK_GIANT" "TACTICSBOOK_HIGHTECH" //"TACTICSBOOK_HORROR" //"TACTICSBOOK_LANDSEA" //"TACTICSBOOK_MAGIC" //"TACTICSBOOK_MEDIEVAL" //"TACTICSBOOK_MFANTASY" //"TACTICSBOOK_MODERN" "TACTICSBOOK_POWERS" //"TACTICSBOOK_PREHISTORY" //"TACTICSBOOK_PULP" //"TACTICSBOOK_SCIFI" //"TACTICSBOOK_SKILLS" //"TACTICSBOOK_SPACE" //"TACTICSBOOK_SUPER" "TACTICSBOOK_WORLDWARS") done : boolean := (bl/boolean-write<-booknames booknames)] (string<-any done)) :context :doc "The default function for app main execution. Arguments come from the command line.")
nx/tactics/apptactics / context-nx
Description:
  • Returns the context for execution. Arguments come from the command line.
Function Name:
  • context-nx
Return Type:
  • vx/core/context
Arguments:
  • Name
    Type
    Generic
    Description
    args
    vx/core/anylist
Usage/Test Cases:
Source Code:
  • (func context-nx : context [args : anylist :...] (context :session (session :user (user :security (security-nx)))) :doc "Returns the context for execution. Arguments come from the command line.")
nx/tactics/apptactics / security-nx
Description:
  • Returns the security for execution.
Function Name:
  • security-nx
Return Type:
  • vx/core/security
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func security-nx : security (security :allowfuncs (funclist fil/boolean-write<-file-any fil/boolean-write<-file-string fil/file-read<-file fil/string-read<-file)) :doc "Returns the security for execution.")
nx/tactics/base
Description:
  • Tactics Base Types
Package Name:
  • nx/tactics/base
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
Types:
  • ability, abilitymap, book, bookmap, card, cardlist, cardmap, chapter, chapterlist, chaptermap, damage, damagelist, damagemap, deck, deckmap, goal, item, itemmap, location, locationmap, mind, modifier, playingcard, power, powermap, rank, rating, role, rolemap, rule, rulemap, scenario, scenariomap, section, sectionmap, skill, skillmap, specialty, specialtymap, stat, suit, suitmap, terrain, terrainmap, threat, unit, unitability, unitabilitymap, unititem, unititemmap, unitmap, unitpower, unitpowermap, unitskill, unitskillmap, unitspecialty, unitspecialtymap, unitweakness, unitweaknessmap, weakness, weaknessmap
Constants:
  • rank-ace, rank-king, rank-queen, rank-jack, rank-10, rank-9, rank-8, rank-7, rank-6, rank-5, rank-4, rank-3, rank-2, rank-joker, role-aoe, role-bosskiller, role-buffer, role-crowdcontrol, role-distracter, role-healer, role-sniper, role-tank, role-trapper, role-utility, stat-beast, stat-body, stat-mind, stat-shadow, stat-will, stat-speed, suit-club, suit-diamond, suit-heart, suit-spade
Functions:
  • rating<-mass
Source Code:
  • (package nx/tactics/base :doc "Tactics Base Types") (type ability : struct :traits [card]) (type abilitymap : map :allowtypes [ability]) (type book : struct :traits [card] :properties [chaptermap : chaptermap]) (type bookmap : map :allowtypes [book]) (type card : struct :properties [name : string image : string reference : string summary : string titles : string orientation : string]) (type cardlist : list :allowtypes [card]) (type cardmap : map :allowtypes [card]) (type chapter : struct :traits [card] :properties [sectionmap : sectionmap]) (type chapterlist : list :allowtypes [chapter]) (type chaptermap : map :allowtypes [chapter]) (type damage : struct :traits [card]) (type damagelist : list :allowtypes [damage]) (type damagemap : map :allowtypes [damage]) (type deck : struct :traits [card] :properties [cardmap : cardmap]) (type deckmap : map :traits [card] :allowtypes [deck]) (type goal : struct :properties [description : string progress : int complete : int reward : string] :traits [card]) (type item : struct :traits [card] :properties [body : rating mind : rating will : rating speed : rating shadow : rating beast : rating classification : string length : string mass : string modifiers : string muzzlevelocity : string range : string rof : string rolemap : rolemap value : string]) (type itemmap : map :allowtypes [item]) (type location : struct :traits [card] :properties [locationmap : locationmap unitmap : unitmap]) (type locationmap : map :allowtypes [location]) (type mind : struct :traits [card] :doc "The ability to use rational thought to do tasks. This is the opposite of the [Shadow].") (type modifier : struct :traits [card]) (type playingcard : struct :properties [rank : rank suit : suit]) (type power : struct :traits [card] :properties [stat : string abilitymap : abilitymap specialtymap : specialtymap]) (type powermap : map :allowtypes [power]) (type rank : struct :traits [card]) (type rating : struct :traits [card] :properties [level : int :doc "Values: 2->10" part : int :doc "Values: 0->9" scale : int :doc "Values: -x->x"] :doc "Rating are displayed as level.part:scale.") (type role : struct) (type rolemap : map :allowtypes [role]) (type rule : struct :properties [classification : string] :traits [card]) (type rulemap : map :allowtypes [rule]) (type scenario : struct :traits [card]) (type scenariomap : map :allowtypes [scenario]) (type section : struct :traits [card] :properties [damagemap : damagemap deckmap : deckmap itemmap : itemmap locationmap : locationmap powermap : powermap rulemap : rulemap scenariomap : scenariomap sectionmap : sectionmap skillmap : skillmap suitmap : suitmap terrainmap : terrainmap unitmap : unitmap weaknessmap : weaknessmap]) (type sectionmap : map :allowtypes [section]) (type skill : struct :traits [card] :properties [stat : string abilitymap : abilitymap specialtymap : specialtymap]) (type skillmap : map :allowtypes [skill]) (type specialty : struct :traits [card]) (type specialtymap : map :traits [card] :allowtypes [specialty]) (type stat : struct :traits [card]) (type suit : struct :traits [card]) (type suitmap : map :traits [card] :allowtypes [suit]) (type terrain : struct :traits [card]) (type terrainmap : map :allowtypes [terrain]) (type threat : struct :properties [description : string progress : int complete : int consequences : string] :traits [card]) (type unit : struct :traits [card] :properties [body : string mind : string will : string speed : string shadow : string beast : string demeanor : string nature : string classification : string crew : string mass : string height : string length : string value : string width : string damagelist : damagelist rolemap : rolemap unitpowermap : unitpowermap unitskillmap : unitskillmap unitweaknessmap : unitweaknessmap]) (type unitability : struct :properties [name : string image : string]) (type unitabilitymap : map :allowtypes [unitability]) (type unititem : struct :properties [facing : string number : string value : string] :traits [card]) (type unititemmap : map :allowtypes [unititem]) (type unitmap : map :allowtypes [unit]) (type unitpower : struct :properties [level : string power : power front : string back : string over : string under : string side : string strength : string unitabilitymap : unitabilitymap unititemmap : unititemmap unitspecialtymap : unitspecialtymap] :traits [card]) (type unitpowermap : map :allowtypes [unitpower]) (type unitskill : struct :properties [level : string skill : skill unitabilitymap : unitabilitymap unititemmap : unititemmap unitspecialtymap : unitspecialtymap] :traits [card]) (type unitskillmap : map :allowtypes [unitskill]) (type unitspecialty : struct :properties [name : string image : string]) (type unitspecialtymap : map :allowtypes [unitspecialty]) (type unitweakness : struct :traits [card]) (type unitweaknessmap : map :allowtypes [unitweakness]) (type weakness : struct :traits [card]) (type weaknessmap : map :allowtypes [weakness]) (const rank-ace : rank) (const rank-king : rank) (const rank-queen : rank) (const rank-jack : rank) (const rank-10 : rank) (const rank-9 : rank) (const rank-8 : rank) (const rank-7 : rank) (const rank-6 : rank) (const rank-5 : rank) (const rank-4 : rank) (const rank-3 : rank) (const rank-2 : rank) (const rank-joker : rank) (const role-aoe : role) (const role-bosskiller : role) (const role-buffer : role) (const role-crowdcontrol : role) (const role-distracter : role) (const role-healer : role) (const role-sniper : role) (const role-tank : role) (const role-trapper : role) (const role-utility : role) (const stat-beast : stat :doc "The ability to use wild rage or terror to lash out or flee. This is the opposite of the [Will].") (const stat-body : stat) (const stat-mind : stat) (const stat-shadow : stat :doc "The ability to use rational thought to do selfish/impulsive acts. This is the opposite of the [Mind].") (const stat-will : stat) (const stat-speed : stat) (const suit-club : suit) (const suit-diamond : suit) (const suit-heart : suit) (const suit-spade : suit) (func rating<-mass : rating [mass : string] :doc "Return a rating from a mass.")
nx/tactics/base / ability
Description:
Type Name:
  • ability
Extends:
  • :struct
Default:
Usage/Test Cases:
Source Code:
  • (type ability : struct :traits [card])
nx/tactics/base / abilitymap
Description:
Type Name:
  • abilitymap
Extends:
  • :map
Default:
Allowed Types:
  • ability
Usage/Test Cases:
Source Code:
  • (type abilitymap : map :allowtypes [ability])
nx/tactics/base / book
Description:
Type Name:
  • book
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    chaptermap
    nx/tactics/base/chaptermap
    false
    false
Usage/Test Cases:
Source Code:
  • (type book : struct :traits [card] :properties [chaptermap : chaptermap])
nx/tactics/base / bookmap
Description:
Type Name:
  • bookmap
Extends:
  • :map
Default:
Allowed Types:
  • book
Usage/Test Cases:
Source Code:
  • (type bookmap : map :allowtypes [book])
nx/tactics/base / card
Description:
Type Name:
  • card
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    name
    vx/core/string
    false
    false
    image
    vx/core/string
    false
    false
    reference
    vx/core/string
    false
    false
    summary
    vx/core/string
    false
    false
    titles
    vx/core/string
    false
    false
    orientation
    vx/core/string
    false
    false
Usage/Test Cases:
Source Code:
  • (type card : struct :properties [name : string image : string reference : string summary : string titles : string orientation : string])
nx/tactics/base / cardlist
Description:
Type Name:
  • cardlist
Extends:
  • :list
Default:
Allowed Types:
  • card
Usage/Test Cases:
Source Code:
  • (type cardlist : list :allowtypes [card])
nx/tactics/base / cardmap
Description:
Type Name:
  • cardmap
Extends:
  • :map
Default:
Allowed Types:
  • card
Usage/Test Cases:
Source Code:
  • (type cardmap : map :allowtypes [card])
nx/tactics/base / chapter
Description:
Type Name:
  • chapter
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    sectionmap
    nx/tactics/base/sectionmap
    false
    false
Usage/Test Cases:
Source Code:
  • (type chapter : struct :traits [card] :properties [sectionmap : sectionmap])
nx/tactics/base / chapterlist
Description:
Type Name:
  • chapterlist
Extends:
  • :list
Default:
Allowed Types:
  • chapter
Usage/Test Cases:
Source Code:
  • (type chapterlist : list :allowtypes [chapter])
nx/tactics/base / chaptermap
Description:
Type Name:
  • chaptermap
Extends:
  • :map
Default:
Allowed Types:
  • chapter
Usage/Test Cases:
Source Code:
  • (type chaptermap : map :allowtypes [chapter])
nx/tactics/base / damage
Description:
Type Name:
  • damage
Extends:
  • :struct
Default:
Usage/Test Cases:
Source Code:
  • (type damage : struct :traits [card])
nx/tactics/base / damagelist
Description:
Type Name:
  • damagelist
Extends:
  • :list
Default:
Allowed Types:
  • damage
Usage/Test Cases:
Source Code:
  • (type damagelist : list :allowtypes [damage])
nx/tactics/base / damagemap
Description:
Type Name:
  • damagemap
Extends:
  • :map
Default:
Allowed Types:
  • damage
Usage/Test Cases:
Source Code:
  • (type damagemap : map :allowtypes [damage])
nx/tactics/base / deck
Description:
Type Name:
  • deck
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    cardmap
    nx/tactics/base/cardmap
    false
    false
Usage/Test Cases:
Source Code:
  • (type deck : struct :traits [card] :properties [cardmap : cardmap])
nx/tactics/base / deckmap
Description:
Type Name:
  • deckmap
Extends:
  • :map
Default:
Allowed Types:
  • deck
Usage/Test Cases:
Source Code:
  • (type deckmap : map :traits [card] :allowtypes [deck])
nx/tactics/base / goal
Description:
Type Name:
  • goal
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    description
    vx/core/string
    false
    false
    progress
    vx/core/int
    false
    false
    complete
    vx/core/int
    false
    false
    reward
    vx/core/string
    false
    false
Usage/Test Cases:
Source Code:
  • (type goal : struct :properties [description : string progress : int complete : int reward : string] :traits [card])
nx/tactics/base / item
Description:
Type Name:
  • item
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    body
    nx/tactics/base/rating
    false
    false
    mind
    nx/tactics/base/rating
    false
    false
    will
    nx/tactics/base/rating
    false
    false
    speed
    nx/tactics/base/rating
    false
    false
    shadow
    nx/tactics/base/rating
    false
    false
    beast
    nx/tactics/base/rating
    false
    false
    classification
    vx/core/string
    false
    false
    length
    vx/core/string
    false
    false
    mass
    vx/core/string
    false
    false
    modifiers
    vx/core/string
    false
    false
    muzzlevelocity
    vx/core/string
    false
    false
    range
    vx/core/string
    false
    false
    rof
    vx/core/string
    false
    false
    rolemap
    nx/tactics/base/rolemap
    false
    false
    value
    vx/core/string
    false
    false
Usage/Test Cases:
Source Code:
  • (type item : struct :traits [card] :properties [body : rating mind : rating will : rating speed : rating shadow : rating beast : rating classification : string length : string mass : string modifiers : string muzzlevelocity : string range : string rof : string rolemap : rolemap value : string])
nx/tactics/base / itemmap
Description:
Type Name:
  • itemmap
Extends:
  • :map
Default:
Allowed Types:
  • item
Usage/Test Cases:
Source Code:
  • (type itemmap : map :allowtypes [item])
nx/tactics/base / location
Description:
Type Name:
  • location
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    locationmap
    nx/tactics/base/locationmap
    false
    false
    unitmap
    nx/tactics/base/unitmap
    false
    false
Usage/Test Cases:
Source Code:
  • (type location : struct :traits [card] :properties [locationmap : locationmap unitmap : unitmap])
nx/tactics/base / locationmap
Description:
Type Name:
  • locationmap
Extends:
  • :map
Default:
Allowed Types:
  • location
Usage/Test Cases:
Source Code:
  • (type locationmap : map :allowtypes [location])
nx/tactics/base / mind
Description:
  • The ability to use rational thought to do tasks. This is the opposite of the [Shadow].
Type Name:
  • mind
Extends:
  • :struct
Default:
Usage/Test Cases:
Source Code:
  • (type mind : struct :traits [card] :doc "The ability to use rational thought to do tasks. This is the opposite of the [Shadow].")
nx/tactics/base / modifier
Description:
Type Name:
  • modifier
Extends:
  • :struct
Default:
Usage/Test Cases:
Source Code:
  • (type modifier : struct :traits [card])
nx/tactics/base / playingcard
Description:
Type Name:
  • playingcard
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    rank
    nx/tactics/base/rank
    false
    false
    suit
    nx/tactics/base/suit
    false
    false
Usage/Test Cases:
Source Code:
  • (type playingcard : struct :properties [rank : rank suit : suit])
nx/tactics/base / power
Description:
Type Name:
  • power
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    stat
    vx/core/string
    false
    false
    abilitymap
    nx/tactics/base/abilitymap
    false
    false
    specialtymap
    nx/tactics/base/specialtymap
    false
    false
Usage/Test Cases:
Source Code:
  • (type power : struct :traits [card] :properties [stat : string abilitymap : abilitymap specialtymap : specialtymap])
nx/tactics/base / powermap
Description:
Type Name:
  • powermap
Extends:
  • :map
Default:
Allowed Types:
  • power
Usage/Test Cases:
Source Code:
  • (type powermap : map :allowtypes [power])
nx/tactics/base / rank
Description:
Type Name:
  • rank
Extends:
  • :struct
Default:
Usage/Test Cases:
Source Code:
  • (type rank : struct :traits [card])
nx/tactics/base / rating
Description:
  • Rating are displayed as level.part:scale.
Type Name:
  • rating
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    level
    vx/core/int
    Values: 2->10
    false
    false
    part
    vx/core/int
    Values: 0->9
    false
    false
    scale
    vx/core/int
    Values: -x->x
    false
    false
Usage/Test Cases:
Source Code:
  • (type rating : struct :traits [card] :properties [level : int :doc "Values: 2->10" part : int :doc "Values: 0->9" scale : int :doc "Values: -x->x"] :doc "Rating are displayed as level.part:scale.")
nx/tactics/base / role
Description:
Type Name:
  • role
Extends:
  • :struct
Default:
Usage/Test Cases:
Source Code:
  • (type role : struct)
nx/tactics/base / rolemap
Description:
Type Name:
  • rolemap
Extends:
  • :map
Default:
Allowed Types:
  • role
Usage/Test Cases:
Source Code:
  • (type rolemap : map :allowtypes [role])
nx/tactics/base / rule
Description:
Type Name:
  • rule
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    classification
    vx/core/string
    false
    false
Usage/Test Cases:
Source Code:
  • (type rule : struct :properties [classification : string] :traits [card])
nx/tactics/base / rulemap
Description:
Type Name:
  • rulemap
Extends:
  • :map
Default:
Allowed Types:
  • rule
Usage/Test Cases:
Source Code:
  • (type rulemap : map :allowtypes [rule])
nx/tactics/base / scenario
Description:
Type Name:
  • scenario
Extends:
  • :struct
Default:
Usage/Test Cases:
Source Code:
  • (type scenario : struct :traits [card])
nx/tactics/base / scenariomap
Description:
Type Name:
  • scenariomap
Extends:
  • :map
Default:
Allowed Types:
  • scenario
Usage/Test Cases:
Source Code:
  • (type scenariomap : map :allowtypes [scenario])
nx/tactics/base / section
Description:
Type Name:
  • section
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    damagemap
    nx/tactics/base/damagemap
    false
    false
    deckmap
    nx/tactics/base/deckmap
    false
    false
    itemmap
    nx/tactics/base/itemmap
    false
    false
    locationmap
    nx/tactics/base/locationmap
    false
    false
    powermap
    nx/tactics/base/powermap
    false
    false
    rulemap
    nx/tactics/base/rulemap
    false
    false
    scenariomap
    nx/tactics/base/scenariomap
    false
    false
    sectionmap
    nx/tactics/base/sectionmap
    false
    false
    skillmap
    nx/tactics/base/skillmap
    false
    false
    suitmap
    nx/tactics/base/suitmap
    false
    false
    terrainmap
    nx/tactics/base/terrainmap
    false
    false
    unitmap
    nx/tactics/base/unitmap
    false
    false
    weaknessmap
    nx/tactics/base/weaknessmap
    false
    false
Usage/Test Cases:
Source Code:
  • (type section : struct :traits [card] :properties [damagemap : damagemap deckmap : deckmap itemmap : itemmap locationmap : locationmap powermap : powermap rulemap : rulemap scenariomap : scenariomap sectionmap : sectionmap skillmap : skillmap suitmap : suitmap terrainmap : terrainmap unitmap : unitmap weaknessmap : weaknessmap])
nx/tactics/base / sectionmap
Description:
Type Name:
  • sectionmap
Extends:
  • :map
Default:
Allowed Types:
  • section
Usage/Test Cases:
Source Code:
  • (type sectionmap : map :allowtypes [section])
nx/tactics/base / skill
Description:
Type Name:
  • skill
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    stat
    vx/core/string
    false
    false
    abilitymap
    nx/tactics/base/abilitymap
    false
    false
    specialtymap
    nx/tactics/base/specialtymap
    false
    false
Usage/Test Cases:
Source Code:
  • (type skill : struct :traits [card] :properties [stat : string abilitymap : abilitymap specialtymap : specialtymap])
nx/tactics/base / skillmap
Description:
Type Name:
  • skillmap
Extends:
  • :map
Default:
Allowed Types:
  • skill
Usage/Test Cases:
Source Code:
  • (type skillmap : map :allowtypes [skill])
nx/tactics/base / specialty
Description:
Type Name:
  • specialty
Extends:
  • :struct
Default:
Usage/Test Cases:
Source Code:
  • (type specialty : struct :traits [card])
nx/tactics/base / specialtymap
Description:
Type Name:
  • specialtymap
Extends:
  • :map
Default:
Allowed Types:
  • specialty
Usage/Test Cases:
Source Code:
  • (type specialtymap : map :traits [card] :allowtypes [specialty])
nx/tactics/base / stat
Description:
Type Name:
  • stat
Extends:
  • :struct
Default:
Usage/Test Cases:
Source Code:
  • (type stat : struct :traits [card])
nx/tactics/base / suit
Description:
Type Name:
  • suit
Extends:
  • :struct
Default:
Usage/Test Cases:
Source Code:
  • (type suit : struct :traits [card])
nx/tactics/base / suitmap
Description:
Type Name:
  • suitmap
Extends:
  • :map
Default:
Allowed Types:
  • suit
Usage/Test Cases:
Source Code:
  • (type suitmap : map :traits [card] :allowtypes [suit])
nx/tactics/base / terrain
Description:
Type Name:
  • terrain
Extends:
  • :struct
Default:
Usage/Test Cases:
Source Code:
  • (type terrain : struct :traits [card])
nx/tactics/base / terrainmap
Description:
Type Name:
  • terrainmap
Extends:
  • :map
Default:
Allowed Types:
  • terrain
Usage/Test Cases:
Source Code:
  • (type terrainmap : map :allowtypes [terrain])
nx/tactics/base / threat
Description:
Type Name:
  • threat
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    description
    vx/core/string
    false
    false
    progress
    vx/core/int
    false
    false
    complete
    vx/core/int
    false
    false
    consequences
    vx/core/string
    false
    false
Usage/Test Cases:
Source Code:
  • (type threat : struct :properties [description : string progress : int complete : int consequences : string] :traits [card])
nx/tactics/base / unit
Description:
Type Name:
  • unit
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    body
    vx/core/string
    false
    false
    mind
    vx/core/string
    false
    false
    will
    vx/core/string
    false
    false
    speed
    vx/core/string
    false
    false
    shadow
    vx/core/string
    false
    false
    beast
    vx/core/string
    false
    false
    demeanor
    vx/core/string
    false
    false
    nature
    vx/core/string
    false
    false
    classification
    vx/core/string
    false
    false
    crew
    vx/core/string
    false
    false
    mass
    vx/core/string
    false
    false
    height
    vx/core/string
    false
    false
    length
    vx/core/string
    false
    false
    value
    vx/core/string
    false
    false
    width
    vx/core/string
    false
    false
    damagelist
    nx/tactics/base/damagelist
    false
    false
    rolemap
    nx/tactics/base/rolemap
    false
    false
    unitpowermap
    nx/tactics/base/unitpowermap
    false
    false
    unitskillmap
    nx/tactics/base/unitskillmap
    false
    false
    unitweaknessmap
    nx/tactics/base/unitweaknessmap
    false
    false
Usage/Test Cases:
Source Code:
  • (type unit : struct :traits [card] :properties [body : string mind : string will : string speed : string shadow : string beast : string demeanor : string nature : string classification : string crew : string mass : string height : string length : string value : string width : string damagelist : damagelist rolemap : rolemap unitpowermap : unitpowermap unitskillmap : unitskillmap unitweaknessmap : unitweaknessmap])
nx/tactics/base / unitability
Description:
Type Name:
  • unitability
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    name
    vx/core/string
    false
    false
    image
    vx/core/string
    false
    false
Usage/Test Cases:
Source Code:
  • (type unitability : struct :properties [name : string image : string])
nx/tactics/base / unitabilitymap
Description:
Type Name:
  • unitabilitymap
Extends:
  • :map
Default:
Allowed Types:
  • unitability
Usage/Test Cases:
Source Code:
  • (type unitabilitymap : map :allowtypes [unitability])
nx/tactics/base / unititem
Description:
Type Name:
  • unititem
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    facing
    vx/core/string
    false
    false
    number
    vx/core/string
    false
    false
    value
    vx/core/string
    false
    false
Usage/Test Cases:
Source Code:
  • (type unititem : struct :properties [facing : string number : string value : string] :traits [card])
nx/tactics/base / unititemmap
Description:
Type Name:
  • unititemmap
Extends:
  • :map
Default:
Allowed Types:
  • unititem
Usage/Test Cases:
Source Code:
  • (type unititemmap : map :allowtypes [unititem])
nx/tactics/base / unitmap
Description:
Type Name:
  • unitmap
Extends:
  • :map
Default:
Allowed Types:
  • unit
Usage/Test Cases:
Source Code:
  • (type unitmap : map :allowtypes [unit])
nx/tactics/base / unitpower
Description:
Type Name:
  • unitpower
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    level
    vx/core/string
    false
    false
    power
    nx/tactics/base/power
    false
    false
    front
    vx/core/string
    false
    false
    back
    vx/core/string
    false
    false
    over
    vx/core/string
    false
    false
    under
    vx/core/string
    false
    false
    side
    vx/core/string
    false
    false
    strength
    vx/core/string
    false
    false
    unitabilitymap
    nx/tactics/base/unitabilitymap
    false
    false
    unititemmap
    nx/tactics/base/unititemmap
    false
    false
    unitspecialtymap
    nx/tactics/base/unitspecialtymap
    false
    false
Usage/Test Cases:
Source Code:
  • (type unitpower : struct :properties [level : string power : power front : string back : string over : string under : string side : string strength : string unitabilitymap : unitabilitymap unititemmap : unititemmap unitspecialtymap : unitspecialtymap] :traits [card])
nx/tactics/base / unitpowermap
Description:
Type Name:
  • unitpowermap
Extends:
  • :map
Default:
Allowed Types:
  • unitpower
Usage/Test Cases:
Source Code:
  • (type unitpowermap : map :allowtypes [unitpower])
nx/tactics/base / unitskill
Description:
Type Name:
  • unitskill
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    level
    vx/core/string
    false
    false
    skill
    nx/tactics/base/skill
    false
    false
    unitabilitymap
    nx/tactics/base/unitabilitymap
    false
    false
    unititemmap
    nx/tactics/base/unititemmap
    false
    false
    unitspecialtymap
    nx/tactics/base/unitspecialtymap
    false
    false
Usage/Test Cases:
Source Code:
  • (type unitskill : struct :properties [level : string skill : skill unitabilitymap : unitabilitymap unititemmap : unititemmap unitspecialtymap : unitspecialtymap] :traits [card])
nx/tactics/base / unitskillmap
Description:
Type Name:
  • unitskillmap
Extends:
  • :map
Default:
Allowed Types:
  • unitskill
Usage/Test Cases:
Source Code:
  • (type unitskillmap : map :allowtypes [unitskill])
nx/tactics/base / unitspecialty
Description:
Type Name:
  • unitspecialty
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    name
    vx/core/string
    false
    false
    image
    vx/core/string
    false
    false
Usage/Test Cases:
Source Code:
  • (type unitspecialty : struct :properties [name : string image : string])
nx/tactics/base / unitspecialtymap
Description:
Type Name:
  • unitspecialtymap
Extends:
  • :map
Default:
Allowed Types:
  • unitspecialty
Usage/Test Cases:
Source Code:
  • (type unitspecialtymap : map :allowtypes [unitspecialty])
nx/tactics/base / unitweakness
Description:
Type Name:
  • unitweakness
Extends:
  • :struct
Default:
Usage/Test Cases:
Source Code:
  • (type unitweakness : struct :traits [card])
nx/tactics/base / unitweaknessmap
Description:
Type Name:
  • unitweaknessmap
Extends:
  • :map
Default:
Allowed Types:
  • unitweakness
Usage/Test Cases:
Source Code:
  • (type unitweaknessmap : map :allowtypes [unitweakness])
nx/tactics/base / weakness
Description:
Type Name:
  • weakness
Extends:
  • :struct
Default:
Usage/Test Cases:
Source Code:
  • (type weakness : struct :traits [card])
nx/tactics/base / weaknessmap
Description:
Type Name:
  • weaknessmap
Extends:
  • :map
Default:
Allowed Types:
  • weakness
Usage/Test Cases:
Source Code:
  • (type weaknessmap : map :allowtypes [weakness])
nx/tactics/base / rank-ace
Description:
Constant Name:
  • rank-ace
Type:
  • nx/tactics/base/rank
Usage/Test Cases:
Source Code:
  • (const rank-ace : rank)
nx/tactics/base / rank-king
Description:
Constant Name:
  • rank-king
Type:
  • nx/tactics/base/rank
Usage/Test Cases:
Source Code:
  • (const rank-king : rank)
nx/tactics/base / rank-queen
Description:
Constant Name:
  • rank-queen
Type:
  • nx/tactics/base/rank
Usage/Test Cases:
Source Code:
  • (const rank-queen : rank)
nx/tactics/base / rank-jack
Description:
Constant Name:
  • rank-jack
Type:
  • nx/tactics/base/rank
Usage/Test Cases:
Source Code:
  • (const rank-jack : rank)
nx/tactics/base / rank-10
Description:
Constant Name:
  • rank-10
Type:
  • nx/tactics/base/rank
Usage/Test Cases:
Source Code:
  • (const rank-10 : rank)
nx/tactics/base / rank-9
Description:
Constant Name:
  • rank-9
Type:
  • nx/tactics/base/rank
Usage/Test Cases:
Source Code:
  • (const rank-9 : rank)
nx/tactics/base / rank-8
Description:
Constant Name:
  • rank-8
Type:
  • nx/tactics/base/rank
Usage/Test Cases:
Source Code:
  • (const rank-8 : rank)
nx/tactics/base / rank-7
Description:
Constant Name:
  • rank-7
Type:
  • nx/tactics/base/rank
Usage/Test Cases:
Source Code:
  • (const rank-7 : rank)
nx/tactics/base / rank-6
Description:
Constant Name:
  • rank-6
Type:
  • nx/tactics/base/rank
Usage/Test Cases:
Source Code:
  • (const rank-6 : rank)
nx/tactics/base / rank-5
Description:
Constant Name:
  • rank-5
Type:
  • nx/tactics/base/rank
Usage/Test Cases:
Source Code:
  • (const rank-5 : rank)
nx/tactics/base / rank-4
Description:
Constant Name:
  • rank-4
Type:
  • nx/tactics/base/rank
Usage/Test Cases:
Source Code:
  • (const rank-4 : rank)
nx/tactics/base / rank-3
Description:
Constant Name:
  • rank-3
Type:
  • nx/tactics/base/rank
Usage/Test Cases:
Source Code:
  • (const rank-3 : rank)
nx/tactics/base / rank-2
Description:
Constant Name:
  • rank-2
Type:
  • nx/tactics/base/rank
Usage/Test Cases:
Source Code:
  • (const rank-2 : rank)
nx/tactics/base / rank-joker
Description:
Constant Name:
  • rank-joker
Type:
  • nx/tactics/base/rank
Usage/Test Cases:
Source Code:
  • (const rank-joker : rank)
nx/tactics/base / role-aoe
Description:
Constant Name:
  • role-aoe
Type:
  • nx/tactics/base/role
Usage/Test Cases:
Source Code:
  • (const role-aoe : role)
nx/tactics/base / role-bosskiller
Description:
Constant Name:
  • role-bosskiller
Type:
  • nx/tactics/base/role
Usage/Test Cases:
Source Code:
  • (const role-bosskiller : role)
nx/tactics/base / role-buffer
Description:
Constant Name:
  • role-buffer
Type:
  • nx/tactics/base/role
Usage/Test Cases:
Source Code:
  • (const role-buffer : role)
nx/tactics/base / role-crowdcontrol
Description:
Constant Name:
  • role-crowdcontrol
Type:
  • nx/tactics/base/role
Usage/Test Cases:
Source Code:
  • (const role-crowdcontrol : role)
nx/tactics/base / role-distracter
Description:
Constant Name:
  • role-distracter
Type:
  • nx/tactics/base/role
Usage/Test Cases:
Source Code:
  • (const role-distracter : role)
nx/tactics/base / role-healer
Description:
Constant Name:
  • role-healer
Type:
  • nx/tactics/base/role
Usage/Test Cases:
Source Code:
  • (const role-healer : role)
nx/tactics/base / role-sniper
Description:
Constant Name:
  • role-sniper
Type:
  • nx/tactics/base/role
Usage/Test Cases:
Source Code:
  • (const role-sniper : role)
nx/tactics/base / role-tank
Description:
Constant Name:
  • role-tank
Type:
  • nx/tactics/base/role
Usage/Test Cases:
Source Code:
  • (const role-tank : role)
nx/tactics/base / role-trapper
Description:
Constant Name:
  • role-trapper
Type:
  • nx/tactics/base/role
Usage/Test Cases:
Source Code:
  • (const role-trapper : role)
nx/tactics/base / role-utility
Description:
Constant Name:
  • role-utility
Type:
  • nx/tactics/base/role
Usage/Test Cases:
Source Code:
  • (const role-utility : role)
nx/tactics/base / stat-beast
Description:
  • The ability to use wild rage or terror to lash out or flee. This is the opposite of the [Will].
Constant Name:
  • stat-beast
Type:
  • nx/tactics/base/stat
Usage/Test Cases:
Source Code:
  • (const stat-beast : stat :doc "The ability to use wild rage or terror to lash out or flee. This is the opposite of the [Will].")
nx/tactics/base / stat-body
Description:
Constant Name:
  • stat-body
Type:
  • nx/tactics/base/stat
Usage/Test Cases:
Source Code:
  • (const stat-body : stat)
nx/tactics/base / stat-mind
Description:
Constant Name:
  • stat-mind
Type:
  • nx/tactics/base/stat
Usage/Test Cases:
Source Code:
  • (const stat-mind : stat)
nx/tactics/base / stat-shadow
Description:
  • The ability to use rational thought to do selfish/impulsive acts. This is the opposite of the [Mind].
Constant Name:
  • stat-shadow
Type:
  • nx/tactics/base/stat
Usage/Test Cases:
Source Code:
  • (const stat-shadow : stat :doc "The ability to use rational thought to do selfish/impulsive acts. This is the opposite of the [Mind].")
nx/tactics/base / stat-will
Description:
Constant Name:
  • stat-will
Type:
  • nx/tactics/base/stat
Usage/Test Cases:
Source Code:
  • (const stat-will : stat)
nx/tactics/base / stat-speed
Description:
Constant Name:
  • stat-speed
Type:
  • nx/tactics/base/stat
Usage/Test Cases:
Source Code:
  • (const stat-speed : stat)
nx/tactics/base / suit-club
Description:
Constant Name:
  • suit-club
Type:
  • nx/tactics/base/suit
Usage/Test Cases:
Source Code:
  • (const suit-club : suit)
nx/tactics/base / suit-diamond
Description:
Constant Name:
  • suit-diamond
Type:
  • nx/tactics/base/suit
Usage/Test Cases:
Source Code:
  • (const suit-diamond : suit)
nx/tactics/base / suit-heart
Description:
Constant Name:
  • suit-heart
Type:
  • nx/tactics/base/suit
Usage/Test Cases:
Source Code:
  • (const suit-heart : suit)
nx/tactics/base / suit-spade
Description:
Constant Name:
  • suit-spade
Type:
  • nx/tactics/base/suit
Usage/Test Cases:
Source Code:
  • (const suit-spade : suit)
nx/tactics/base / rating<-mass
Description:
  • Return a rating from a mass.
Function Name:
  • rating<-mass
Return Type:
  • nx/tactics/base/rating
Arguments:
  • Name
    Type
    Generic
    Description
    mass
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func rating<-mass : rating [mass : string] :doc "Return a rating from a mass.")
nx/tactics/books/advanced_rules
Description:
Package Name:
  • nx/tactics/books/advanced_rules
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
Functions:
  • tacticsbook
Source Code:
  • (package nx/tactics/books/advanced_rules :libs (lib base :path nx/tactics/base)) (func tacticsbook : base/book (book :name "Advanced Rules" :image "AdvancedRules.jpg" :chaptermap (chaptermap "Advanced Rules Overview" (chapter :name "Advanced Rules Overview" :sectionmap (sectionmap "Advanced Rules Strategies" (section :name "Advanced Rules Strategies" :summary "* Strike First - Units are immediately penalized for damage taken, so do unto others before they do unto you. * Maintain a Threat - The battlefield changes with each unit's move, so use pawns to control the map while saving powerful and valuable units until later in the Round. If you are not careful your opponent will surround and eliminate your units that have already acted. * Hold the Line - Opportunity and Hold Off abilities are deadly and allow you to protect weaker units. * Use the Terrain - Cover and abilities linked to cover offer an outstanding defense that layers with normal defense. The difference is most pronounced with lesser units. Effective use of terrain will determine the victor in most battles."))) "Advanced Tokens" (chapter :name "Advanced Tokens" :sectionmap (sectionmap "Advanced Purple Tokens" (section :name "Advanced Purple Tokens" :rulemap (rulemap :Ace (rule :name "Ace" :image "Tokens/AceToken.png" :summary "* [Action]: [+1 Skill] * [Defense]: [+1 Defense]" :titles "Elite" :classification "Purple Token") :Apathy (rule :name "Apathy" :classification "Purple Token") :Hidden (rule :name "Hidden" :summary "* [Action]: A unit with Hidden tokens is not actually at the location shown by its unit marker. * [Defense]: Any unit that can see the unit marker may spend an [Action] to attempt to attack or locate the unit. This is done by the unit secretly choosing the actual location of the unit up to the number of Hidden tokens away from the unit marker where the unit lies (note: the target location may not be passed a barrier that the unit could not cross with normal movement). The opponent then tries to guess both direction and distance. The unit then reveals its actual position and moves its unit marker there. If both are guessed, the unit is discovered and loses all Hidden tokens. If either is guessed, the unit loses 1 Hidden token. If the unit has no Hidden tokens, resolve the attack normally. If the unit has Hidden tokens then the unit remains hidden and any attack fails unless it is an area effect and the unit is the effect." :classification "Purple Token") :Prepare (rule :name "Prepare" :summary "* [Action]: An item with Prepare may not be used until it has Prepare tokens equal to Prepare value. * [Action]: If unit does not move this [Turn], add a Prepare token to it. * Note: If the unit moves or takes a another action, then remove all Prepare tokens."))))) "Advanced Rules" (chapter :name "Advanced Rules" :sectionmap (sectionmap "Damage Cards" (section :name "Damage Cards" :damagemap (damagemap :Damage (damage :name "Damage" :summary "* Effect: -1 [Body] * Duration: Permanent until healed. * Regular Damage with no side-effects.") "Air Reserve Loss" (damage :name "Air Reserve Loss") "Air Circulation Failure" (damage :name "Air Circulation Failure") "Air Purification Failure" (damage :name "Air Purification Failure") "Attitude Control Malfunction" (damage :name "Attitude Control Malfunction") "Cargo Damage" (damage :name "Cargo Damage") "Cargo Fire" (damage :name "Cargo Fire") "Cargo Loss" (damage :name "Cargo Loss") "Crew Casualties" (damage :name "Crew Casualties") "Crew Quarters Fire" (damage :name "Crew Quarters Fire") "Fire Suppression Failure" (damage :name "Fire Suppression Failure") "Movement Impaired" (damage :name "Movement Impaired" :summary "* Effect: -25% [Move] * Duration: Permanent until unit spends an entire turn repairing.") "Movement Crippled" (damage :name "Movement Crippled" :summary "* Effect: -25% [Move] * Duration: Permanent until healed.") "Movement Control Failure" (damage :name "Movement Control Failure" :summary "* Unit must move at full speed until repaired.") "Artificial Gravity Malfunction" (damage :name "Artificial Gravity Malfunction") "Bridge Damaged" (damage :name "Bridge Damaged") "Bridge Explosion" (damage :name "Bridge Explosion") "Bridge Fire" (damage :name "Bridge Fire") "Bulkhead Collapse" (damage :name "Bulkhead Collapse") "Cargo Hold Damaged" (damage :name "Cargo Hold Damaged") "Cargo Hold Explosion" (damage :name "Cargo Hold Explosion") "Cargo Hold Fire" (damage :name "Cargo Hold Fire") "Central Computer Malfunction" (damage :name "Central Computer Malfunction") "Central Computer Explosion" (damage :name "Central Computer Explosion") "Central Computer Fire" (damage :name "Central Computer Fire") "Command and Control Failure" (damage :name "Command and Control Failure") "Communications Failure" (damage :name "Communications Failure" :summary "* Unit cannot communicate with other units. * In Game: Player may not speak. He/she may write rules questions to game master or opponents.") "Crew Quarters Damaged" (damage :name "Crew Quarters Damaged") "Damage Control Damaged" (damage :name "Damage Control Damaged") "Engineering Damage" (damage :name "Engineering Damage") "Fire Control System Malfunction" (damage :name "Fire Control System Malfunction") "Flag Bridge Damaged" (damage :name "Flag Bridge Damaged" :summary "* The Flag Bridge is used by senior executive officers to coordinate a fleet.") "Food Stock Damaged" (damage :name "Food Stock Damaged") "Fuel Explosion" (damage :name "Fuel Explosion") "Fuel Fire" (damage :name "Fuel Fire") "Fuel Loss" (damage :name "Fuel Loss") "Helm Control Malfunction" (damage :name "Helm Control Malfunction") "Helm Fire" (damage :name "Helm Fire") "Hydroponics Damage" (damage :name "Hydroponics Damage") "Inertial Dampener Malfunction" (damage :name "Inertial Dampener Malfunction") "Intercommunications Failure" (damage :name "Intercommunications Failure" :summary "* Unit cannot communicate within the vehicle except person to person. On large vehicles, this can be a localized failure.") "Life Support Malfunction" (damage :name "Life Support Malfunction") "Medical Bay Damage" (damage :name "Medical Bay Damage") "Medical Bay Explosion" (damage :name "Medical Bay Explosion") "Medical Bay Fire" (damage :name "Medical Bay Fire") "Missile Launcher Explosion" (damage :name "Missile Launcher Explosion") "Missile Launcher Malfunction" (damage :name "Missile Launcher Malfunction") "Missile Magazine Explosion" (damage :name "Missile Magazine Explosion") "Missile Magazine Fire" (damage :name "Missile Magazine Fire") "Movement Malfunction" (damage :name "Movement Malfunction") "Navigation Failure" (damage :name "Navigation Failure") "Navigation Light Failure" (damage :name "Navigation Light Failure" :summary "* The vehicles navigation/landing lights are not working across all spectrums. In combat, these lights are normally off anyway, but they make any landing or docking manuever much more perilous.") "Passenger Quarters Explosion" (damage :name "Passenger Quarters Explosion") "Passenger Quarters Fire" (damage :name "Passenger Quarters Fire") "Power Control Failure" (damage :name "Power Control Failure") "Power Plant Coolant Failure" (damage :name "Power Plant Coolant Failure") "Power Plant Damage" (damage :name "Power Plant Damage") "Power Plant Explosion" (damage :name "Power Plant Explosion") "Power Plant Fire" (damage :name "Power Plant Fire") "Power Failure" (damage :name "Power Failure") "Propellent Loss" (damage :name "Propellent Loss") "Remote Systems Malfunction" (damage :name "Remote Systems Malfunction" :summary "* Command over drones is lost.") "Secondary Bridge Explosion" (damage :name "Secondary Bridge Explosion") "Secondary Bridge Fire" (damage :name "Secondary Bridge Fire") "Secondary Bridge Malfunction" (damage :name "Secondary Bridge Malfunction") "Sensor (Short Range) Malfunction" (damage :name "Sensor (Short Range) Malfunction") "Sensor (Long Range) Malfunction" (damage :name "Sensor (Long Range) Malfunction") "Shield Malfunction" (damage :name "Shield Malfunction") "Spine Cracks" (damage :name "Spine Cracks") "Steering Malfunction" (damage :name "Steering Malfunction" :summary "* Unit can only perform 1 change in direction during a Move.") "Structural Collapse" (damage :name "Structural Collapse") "Target Aquisition Failure" (damage :name "Target Aquisition Failure") "Temperature Control Failure" (damage :name "Temperature Control Failure") "Turning Malfunction" (damage :name "Turning Malfunction" :summary "* Unit cannot turn toward one side.") "Transponder Failure" (damage :name "Transponder Failure" :summary "* The vehicle no longer identifies as friend of foe, so it appears as a potential enemy vehicle. In a heated exchange it may take friendly fire. * This can be as simple as a fallen flag on old navy ships." :titles "IFF Damage, Not Running Colors") "Water Reserve Loss" (damage :name "Water Reserve Loss") "Weapon Magazine Explosion" (damage :name "Weapon Magazine Explosion") "Weapon Magazine Fire" (damage :name "Weapon Magazine Fire") "Weapon Malfunction" (damage :name "Weapon Malfunction") "Weapon Explosion" (damage :name "Weapon Explosion") "Weapon Fire" (damage :name "Weapon Fire") "Weapon Power Failure" (damage :name "Weapon Power Failure") "Weapon Traverse Malfunction" (damage :name "Weapon Traverse Malfunction"))))) :Genres (chapter :name "Genres" :sectionmap (sectionmap :RTS/4X (section :name "RTS/4X" :summary "4X: * eXplore * eXpand * eXploit * eXterminate"))))))
nx/tactics/books/advanced_rules / tacticsbook
Description:
Function Name:
  • tacticsbook
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func tacticsbook : base/book (book :name "Advanced Rules" :image "AdvancedRules.jpg" :chaptermap (chaptermap "Advanced Rules Overview" (chapter :name "Advanced Rules Overview" :sectionmap (sectionmap "Advanced Rules Strategies" (section :name "Advanced Rules Strategies" :summary "* Strike First - Units are immediately penalized for damage taken, so do unto others before they do unto you. * Maintain a Threat - The battlefield changes with each unit's move, so use pawns to control the map while saving powerful and valuable units until later in the Round. If you are not careful your opponent will surround and eliminate your units that have already acted. * Hold the Line - Opportunity and Hold Off abilities are deadly and allow you to protect weaker units. * Use the Terrain - Cover and abilities linked to cover offer an outstanding defense that layers with normal defense. The difference is most pronounced with lesser units. Effective use of terrain will determine the victor in most battles."))) "Advanced Tokens" (chapter :name "Advanced Tokens" :sectionmap (sectionmap "Advanced Purple Tokens" (section :name "Advanced Purple Tokens" :rulemap (rulemap :Ace (rule :name "Ace" :image "Tokens/AceToken.png" :summary "* [Action]: [+1 Skill] * [Defense]: [+1 Defense]" :titles "Elite" :classification "Purple Token") :Apathy (rule :name "Apathy" :classification "Purple Token") :Hidden (rule :name "Hidden" :summary "* [Action]: A unit with Hidden tokens is not actually at the location shown by its unit marker. * [Defense]: Any unit that can see the unit marker may spend an [Action] to attempt to attack or locate the unit. This is done by the unit secretly choosing the actual location of the unit up to the number of Hidden tokens away from the unit marker where the unit lies (note: the target location may not be passed a barrier that the unit could not cross with normal movement). The opponent then tries to guess both direction and distance. The unit then reveals its actual position and moves its unit marker there. If both are guessed, the unit is discovered and loses all Hidden tokens. If either is guessed, the unit loses 1 Hidden token. If the unit has no Hidden tokens, resolve the attack normally. If the unit has Hidden tokens then the unit remains hidden and any attack fails unless it is an area effect and the unit is the effect." :classification "Purple Token") :Prepare (rule :name "Prepare" :summary "* [Action]: An item with Prepare may not be used until it has Prepare tokens equal to Prepare value. * [Action]: If unit does not move this [Turn], add a Prepare token to it. * Note: If the unit moves or takes a another action, then remove all Prepare tokens."))))) "Advanced Rules" (chapter :name "Advanced Rules" :sectionmap (sectionmap "Damage Cards" (section :name "Damage Cards" :damagemap (damagemap :Damage (damage :name "Damage" :summary "* Effect: -1 [Body] * Duration: Permanent until healed. * Regular Damage with no side-effects.") "Air Reserve Loss" (damage :name "Air Reserve Loss") "Air Circulation Failure" (damage :name "Air Circulation Failure") "Air Purification Failure" (damage :name "Air Purification Failure") "Attitude Control Malfunction" (damage :name "Attitude Control Malfunction") "Cargo Damage" (damage :name "Cargo Damage") "Cargo Fire" (damage :name "Cargo Fire") "Cargo Loss" (damage :name "Cargo Loss") "Crew Casualties" (damage :name "Crew Casualties") "Crew Quarters Fire" (damage :name "Crew Quarters Fire") "Fire Suppression Failure" (damage :name "Fire Suppression Failure") "Movement Impaired" (damage :name "Movement Impaired" :summary "* Effect: -25% [Move] * Duration: Permanent until unit spends an entire turn repairing.") "Movement Crippled" (damage :name "Movement Crippled" :summary "* Effect: -25% [Move] * Duration: Permanent until healed.") "Movement Control Failure" (damage :name "Movement Control Failure" :summary "* Unit must move at full speed until repaired.") "Artificial Gravity Malfunction" (damage :name "Artificial Gravity Malfunction") "Bridge Damaged" (damage :name "Bridge Damaged") "Bridge Explosion" (damage :name "Bridge Explosion") "Bridge Fire" (damage :name "Bridge Fire") "Bulkhead Collapse" (damage :name "Bulkhead Collapse") "Cargo Hold Damaged" (damage :name "Cargo Hold Damaged") "Cargo Hold Explosion" (damage :name "Cargo Hold Explosion") "Cargo Hold Fire" (damage :name "Cargo Hold Fire") "Central Computer Malfunction" (damage :name "Central Computer Malfunction") "Central Computer Explosion" (damage :name "Central Computer Explosion") "Central Computer Fire" (damage :name "Central Computer Fire") "Command and Control Failure" (damage :name "Command and Control Failure") "Communications Failure" (damage :name "Communications Failure" :summary "* Unit cannot communicate with other units. * In Game: Player may not speak. He/she may write rules questions to game master or opponents.") "Crew Quarters Damaged" (damage :name "Crew Quarters Damaged") "Damage Control Damaged" (damage :name "Damage Control Damaged") "Engineering Damage" (damage :name "Engineering Damage") "Fire Control System Malfunction" (damage :name "Fire Control System Malfunction") "Flag Bridge Damaged" (damage :name "Flag Bridge Damaged" :summary "* The Flag Bridge is used by senior executive officers to coordinate a fleet.") "Food Stock Damaged" (damage :name "Food Stock Damaged") "Fuel Explosion" (damage :name "Fuel Explosion") "Fuel Fire" (damage :name "Fuel Fire") "Fuel Loss" (damage :name "Fuel Loss") "Helm Control Malfunction" (damage :name "Helm Control Malfunction") "Helm Fire" (damage :name "Helm Fire") "Hydroponics Damage" (damage :name "Hydroponics Damage") "Inertial Dampener Malfunction" (damage :name "Inertial Dampener Malfunction") "Intercommunications Failure" (damage :name "Intercommunications Failure" :summary "* Unit cannot communicate within the vehicle except person to person. On large vehicles, this can be a localized failure.") "Life Support Malfunction" (damage :name "Life Support Malfunction") "Medical Bay Damage" (damage :name "Medical Bay Damage") "Medical Bay Explosion" (damage :name "Medical Bay Explosion") "Medical Bay Fire" (damage :name "Medical Bay Fire") "Missile Launcher Explosion" (damage :name "Missile Launcher Explosion") "Missile Launcher Malfunction" (damage :name "Missile Launcher Malfunction") "Missile Magazine Explosion" (damage :name "Missile Magazine Explosion") "Missile Magazine Fire" (damage :name "Missile Magazine Fire") "Movement Malfunction" (damage :name "Movement Malfunction") "Navigation Failure" (damage :name "Navigation Failure") "Navigation Light Failure" (damage :name "Navigation Light Failure" :summary "* The vehicles navigation/landing lights are not working across all spectrums. In combat, these lights are normally off anyway, but they make any landing or docking manuever much more perilous.") "Passenger Quarters Explosion" (damage :name "Passenger Quarters Explosion") "Passenger Quarters Fire" (damage :name "Passenger Quarters Fire") "Power Control Failure" (damage :name "Power Control Failure") "Power Plant Coolant Failure" (damage :name "Power Plant Coolant Failure") "Power Plant Damage" (damage :name "Power Plant Damage") "Power Plant Explosion" (damage :name "Power Plant Explosion") "Power Plant Fire" (damage :name "Power Plant Fire") "Power Failure" (damage :name "Power Failure") "Propellent Loss" (damage :name "Propellent Loss") "Remote Systems Malfunction" (damage :name "Remote Systems Malfunction" :summary "* Command over drones is lost.") "Secondary Bridge Explosion" (damage :name "Secondary Bridge Explosion") "Secondary Bridge Fire" (damage :name "Secondary Bridge Fire") "Secondary Bridge Malfunction" (damage :name "Secondary Bridge Malfunction") "Sensor (Short Range) Malfunction" (damage :name "Sensor (Short Range) Malfunction") "Sensor (Long Range) Malfunction" (damage :name "Sensor (Long Range) Malfunction") "Shield Malfunction" (damage :name "Shield Malfunction") "Spine Cracks" (damage :name "Spine Cracks") "Steering Malfunction" (damage :name "Steering Malfunction" :summary "* Unit can only perform 1 change in direction during a Move.") "Structural Collapse" (damage :name "Structural Collapse") "Target Aquisition Failure" (damage :name "Target Aquisition Failure") "Temperature Control Failure" (damage :name "Temperature Control Failure") "Turning Malfunction" (damage :name "Turning Malfunction" :summary "* Unit cannot turn toward one side.") "Transponder Failure" (damage :name "Transponder Failure" :summary "* The vehicle no longer identifies as friend of foe, so it appears as a potential enemy vehicle. In a heated exchange it may take friendly fire. * This can be as simple as a fallen flag on old navy ships." :titles "IFF Damage, Not Running Colors") "Water Reserve Loss" (damage :name "Water Reserve Loss") "Weapon Magazine Explosion" (damage :name "Weapon Magazine Explosion") "Weapon Magazine Fire" (damage :name "Weapon Magazine Fire") "Weapon Malfunction" (damage :name "Weapon Malfunction") "Weapon Explosion" (damage :name "Weapon Explosion") "Weapon Fire" (damage :name "Weapon Fire") "Weapon Power Failure" (damage :name "Weapon Power Failure") "Weapon Traverse Malfunction" (damage :name "Weapon Traverse Malfunction"))))) :Genres (chapter :name "Genres" :sectionmap (sectionmap :RTS/4X (section :name "RTS/4X" :summary "4X: * eXplore * eXpand * eXploit * eXterminate"))))))
nx/tactics/books/age_of_sail
Description:
Package Name:
  • nx/tactics/books/age_of_sail
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
Functions:
  • tacticsbook
Source Code:
  • (package nx/tactics/books/age_of_sail :libs (lib base :path nx/tactics/base)) (func tacticsbook : base/book (book :name "Age Of Sail" :chaptermap (chaptermap "Age of Sail Overview" (chapter :name "Age of Sail Overview" :sectionmap (sectionmap "Age of Sail Naval Warfare" (section :name "Age of Sail Naval Warfare" :summary "* Wind * Large Ships * Small Ships * Solid Shot * Burning Shot * Chain Shot * Fortifications"))) "Age of Sail Weaponry" (chapter :name "Age of Sail Weaponry" :sectionmap (sectionmap "Age of Sail Cannons" (section :name "Age of Sail Cannons" :itemmap (itemmap :Chainshot (item :name "Chainshot" :image "AgeOfSail/Cannon_Chainshot.jpg" :summary "* Does no damage. All [Hits] are [Disabled Tokens]. All [Critical Hits] are [Crippled Tokens].") :Grapeshot (item :name "Grapeshot" :image "AgeOfSail/Cannon_Grapeshot.jpg") "Round shot" (item :name "Round shot" :image "AgeOfSail/Cannon_Roundshot.jpg") "140mm Field Culverin" (item :name "140mm Field Culverin" :image "AgeOfSail/Culverin.jpg" :summary "600,000J" :classification "Cannon" :length "4.5m" :mass "2.2tons" :muzzlevelocity "400m/s" :range "450m") "100mm Demi-culverin" (item :name "100mm Demi-culverin" :image "AgeOfSail/Demi-culverin.jpg" :classification "Cannon" :length "3.4m" :mass "1.5tons" :muzzlevelocity "487m/s" :range "300m" :rof ".75/min"))))) :Renaissance (chapter :name "Renaissance") "Golden Age of Sail" (chapter :name "Golden Age of Sail" :sectionmap (sectionmap "Age of Sail Spanish" (section :name "Age of Sail Spanish" :unitmap (unitmap "Silver Train" (unit :name "Silver Train") "Treasure Fleet" (unit :name "Treasure Fleet" :classification "Hvy. Naval Vessel") "Spanish Caravel" (unit :name "Spanish Caravel" :image "AgeOfSail/SpanishCaravel.png" :speed "15kph" :classification "Med. Naval Vessel" :crew "20" :mass "150tons" :length "25m" :width "9m" :unitpowermap (unitpowermap :Armor (unitpower :name "Armor" :summary "7 inches (180 mm/30mm RHA)" :front "30mm" :back "30mm" :side "30mm")) :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :level "3" :unitabilitymap (unitabilitymap :Salvo (unitability :name "Salvo")) :unititemmap (unititemmap "100mm Demi-culverin" (unititem :name "100mm Demi-culverin" :number "20"))) :Seamanship (unitskill :name "Seamanship" :level "4"))) "Spanish Galleon" (unit :name "Spanish Galleon" :image "AgeOfSail/SpanishGalleon.png" :reference "Large ships meant for transporting cargo. The Spanish treasure fleets were made of these ships. Although they were sluggish, they weren't the easy target you would expect for they could carry heavy cannon which made attacking them difficult. They had two to three decks. Most had three masts. Some galleons sported 4 masts but these were an exception to the rule." :classification "Hvy. Naval Vessel" :unitpowermap (unitpowermap :Armor (unitpower :name "Armor" :summary "14 inches (360 mm/60mm RHA)" :front "60mm" :back "60mm" :side "60mm"))) "Spanish Man-O-War" (unit :name "Spanish Man-O-War" :image "AgeOfSail/SpanishManOWar.png" :classification "Hvy. Naval Vessel" :mass "1000tons" :unitpowermap (unitpowermap :Armor (unitpower :name "Armor" :summary "14 inches (360 mm/60mm RHA)" :front "60mm" :back "60mm" :side "60mm")) :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :level "4" :unitabilitymap (unitabilitymap :Salvo (unitability :name "Salvo")) :unititemmap (unititemmap "100mm Demi-culverin" (unititem :name "100mm Demi-culverin" :number "100"))) :Seamanship (unitskill :name "Seamanship" :level "4"))) "Spanish Schooner" (unit :name "Spanish Schooner" :image "AgeOfSail/SpanishSchooner.png" :classification "Med. Naval Vessel" :mass "80tons" :length "18m" :width "6m" :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :level "3" :unitabilitymap (unitabilitymap :Salvo (unitability :name "Salvo")) :unititemmap (unititemmap "100mm Demi-culverin" (unititem :name "100mm Demi-culverin" :number "8"))) :Seamanship (unitskill :name "Seamanship" :level "4"))))))) "American Revolution" (chapter :name "American Revolution" :sectionmap (sectionmap "Age of Sail United States" (section :name "Age of Sail United States" :unitmap (unitmap "American Frigate" (unit :name "American Frigate" :image "AgeOfSail/AmericanFrigate.png" :titles "USS Constitution, Old Ironsides" :speed "24kph" :classification "Hvy. Naval Vessel" :mass "2200tons" :length "62m" :unitpowermap (unitpowermap :Armor (unitpower :name "Armor" :summary "21 inches (530 mm/88mm RHA)" :front "88mm" :back "88mm" :side "88mm")) :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :summary "30 x 24-pounder (11 kg) long gun 20 x 32-pounder (15 kg) carronade 2 x 24-pounder (11 kg) bow chasers" :unitabilitymap (unitabilitymap :Salvo (unitability :name "Salvo"))))))))) "French Revolution" (chapter :name "French Revolution") "Tokugawa Shogunate" (chapter :name "Tokugawa Shogunate" :sectionmap (sectionmap "Age of Sail Japan" (section :name "Age of Sail Japan" :unitmap (unitmap "Japanese Archer" (unit :name "Japanese Archer") "Japanese Daimyo" (unit :name "Japanese Daimyo") "Japanese Emperor" (unit :name "Japanese Emperor") "Japanese Rifleman" (unit :name "Japanese Rifleman") "Japnese Samurai" (unit :name "Japnese Samurai"))))))))
nx/tactics/books/age_of_sail / tacticsbook
Description:
Function Name:
  • tacticsbook
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func tacticsbook : base/book (book :name "Age Of Sail" :chaptermap (chaptermap "Age of Sail Overview" (chapter :name "Age of Sail Overview" :sectionmap (sectionmap "Age of Sail Naval Warfare" (section :name "Age of Sail Naval Warfare" :summary "* Wind * Large Ships * Small Ships * Solid Shot * Burning Shot * Chain Shot * Fortifications"))) "Age of Sail Weaponry" (chapter :name "Age of Sail Weaponry" :sectionmap (sectionmap "Age of Sail Cannons" (section :name "Age of Sail Cannons" :itemmap (itemmap :Chainshot (item :name "Chainshot" :image "AgeOfSail/Cannon_Chainshot.jpg" :summary "* Does no damage. All [Hits] are [Disabled Tokens]. All [Critical Hits] are [Crippled Tokens].") :Grapeshot (item :name "Grapeshot" :image "AgeOfSail/Cannon_Grapeshot.jpg") "Round shot" (item :name "Round shot" :image "AgeOfSail/Cannon_Roundshot.jpg") "140mm Field Culverin" (item :name "140mm Field Culverin" :image "AgeOfSail/Culverin.jpg" :summary "600,000J" :classification "Cannon" :length "4.5m" :mass "2.2tons" :muzzlevelocity "400m/s" :range "450m") "100mm Demi-culverin" (item :name "100mm Demi-culverin" :image "AgeOfSail/Demi-culverin.jpg" :classification "Cannon" :length "3.4m" :mass "1.5tons" :muzzlevelocity "487m/s" :range "300m" :rof ".75/min"))))) :Renaissance (chapter :name "Renaissance") "Golden Age of Sail" (chapter :name "Golden Age of Sail" :sectionmap (sectionmap "Age of Sail Spanish" (section :name "Age of Sail Spanish" :unitmap (unitmap "Silver Train" (unit :name "Silver Train") "Treasure Fleet" (unit :name "Treasure Fleet" :classification "Hvy. Naval Vessel") "Spanish Caravel" (unit :name "Spanish Caravel" :image "AgeOfSail/SpanishCaravel.png" :speed "15kph" :classification "Med. Naval Vessel" :crew "20" :mass "150tons" :length "25m" :width "9m" :unitpowermap (unitpowermap :Armor (unitpower :name "Armor" :summary "7 inches (180 mm/30mm RHA)" :front "30mm" :back "30mm" :side "30mm")) :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :level "3" :unitabilitymap (unitabilitymap :Salvo (unitability :name "Salvo")) :unititemmap (unititemmap "100mm Demi-culverin" (unititem :name "100mm Demi-culverin" :number "20"))) :Seamanship (unitskill :name "Seamanship" :level "4"))) "Spanish Galleon" (unit :name "Spanish Galleon" :image "AgeOfSail/SpanishGalleon.png" :reference "Large ships meant for transporting cargo. The Spanish treasure fleets were made of these ships. Although they were sluggish, they weren't the easy target you would expect for they could carry heavy cannon which made attacking them difficult. They had two to three decks. Most had three masts. Some galleons sported 4 masts but these were an exception to the rule." :classification "Hvy. Naval Vessel" :unitpowermap (unitpowermap :Armor (unitpower :name "Armor" :summary "14 inches (360 mm/60mm RHA)" :front "60mm" :back "60mm" :side "60mm"))) "Spanish Man-O-War" (unit :name "Spanish Man-O-War" :image "AgeOfSail/SpanishManOWar.png" :classification "Hvy. Naval Vessel" :mass "1000tons" :unitpowermap (unitpowermap :Armor (unitpower :name "Armor" :summary "14 inches (360 mm/60mm RHA)" :front "60mm" :back "60mm" :side "60mm")) :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :level "4" :unitabilitymap (unitabilitymap :Salvo (unitability :name "Salvo")) :unititemmap (unititemmap "100mm Demi-culverin" (unititem :name "100mm Demi-culverin" :number "100"))) :Seamanship (unitskill :name "Seamanship" :level "4"))) "Spanish Schooner" (unit :name "Spanish Schooner" :image "AgeOfSail/SpanishSchooner.png" :classification "Med. Naval Vessel" :mass "80tons" :length "18m" :width "6m" :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :level "3" :unitabilitymap (unitabilitymap :Salvo (unitability :name "Salvo")) :unititemmap (unititemmap "100mm Demi-culverin" (unititem :name "100mm Demi-culverin" :number "8"))) :Seamanship (unitskill :name "Seamanship" :level "4"))))))) "American Revolution" (chapter :name "American Revolution" :sectionmap (sectionmap "Age of Sail United States" (section :name "Age of Sail United States" :unitmap (unitmap "American Frigate" (unit :name "American Frigate" :image "AgeOfSail/AmericanFrigate.png" :titles "USS Constitution, Old Ironsides" :speed "24kph" :classification "Hvy. Naval Vessel" :mass "2200tons" :length "62m" :unitpowermap (unitpowermap :Armor (unitpower :name "Armor" :summary "21 inches (530 mm/88mm RHA)" :front "88mm" :back "88mm" :side "88mm")) :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :summary "30 x 24-pounder (11 kg) long gun 20 x 32-pounder (15 kg) carronade 2 x 24-pounder (11 kg) bow chasers" :unitabilitymap (unitabilitymap :Salvo (unitability :name "Salvo"))))))))) "French Revolution" (chapter :name "French Revolution") "Tokugawa Shogunate" (chapter :name "Tokugawa Shogunate" :sectionmap (sectionmap "Age of Sail Japan" (section :name "Age of Sail Japan" :unitmap (unitmap "Japanese Archer" (unit :name "Japanese Archer") "Japanese Daimyo" (unit :name "Japanese Daimyo") "Japanese Emperor" (unit :name "Japanese Emperor") "Japanese Rifleman" (unit :name "Japanese Rifleman") "Japnese Samurai" (unit :name "Japnese Samurai"))))))))
nx/tactics/books/age_of_steam
Description:
Package Name:
  • nx/tactics/books/age_of_steam
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
Functions:
  • tacticsbook
Source Code:
  • (package nx/tactics/books/age_of_steam :libs (lib base :path nx/tactics/base)) (func tacticsbook : base/book (book :name "Age of Steam" :image "WildWest.jpg" :chaptermap (chaptermap "Age of Steam Overview" (chapter :name "Age of Steam Overview" :sectionmap (sectionmap "Age of Steam Naval Warfare" (section :name "Age of Steam Naval Warfare" :summary "* Wind * Large Ships * Small Ships * Solid Shot * Burning Shot * Chain Shot"))) "Age of Steam Equipment" (chapter :name "Age of Steam Equipment" :sectionmap (sectionmap "Steam Age Vehicles" (section :name "Steam Age Vehicles" :unitmap (unitmap "Horseless Carriage" (unit :name "Horseless Carriage") "Mailplane Biplane" (unit :name "Mailplane Biplane") "Ocean Liner" (unit :name "Ocean Liner" :titles "Liner, Steam Liner") :Stagecoach (unit :name "Stagecoach") "Steam Ferry" (unit :name "Steam Ferry") "Steam Train Boxcar" (unit :name "Steam Train Boxcar") "Steam Train Caboose" (unit :name "Steam Train Caboose") "Steam Train Coach" (unit :name "Steam Train Coach") "Steam Train Locomotive" (unit :name "Steam Train Locomotive") "Steam Train Private Coach" (unit :name "Steam Train Private Coach") :Steamboat (unit :name "Steamboat") "Tramp Freighter" (unit :name "Tramp Freighter") :Zepplin (unit :name "Zepplin" :titles "Dirigible"))))) "Steam Age Maps" (chapter :name "Steam Age Maps" :sectionmap (sectionmap "Steam Age Terrain" (section :name "Steam Age Terrain" :rulemap (rulemap :Mine (rule :name "Mine") :Tumbleweed (rule :name "Tumbleweed") "Western Town" (rule :name "Western Town"))))) "Civil War" (chapter :name "Civil War" :sectionmap (sectionmap "Union Navy" (section :name "Union Navy" :unitmap (unitmap "USS Monitor" (unit :name "USS Monitor" :speed "15kph" :classification "Hvy. Naval Vessel" :crew "59" :mass "1000tons" :length "52m" :unitpowermap (unitpowermap :Armor (unitpower :name "Armor" :summary "200mm iron turret, 25mm deck, 125mm hull belt" :front "200mm" :back "200mm" :over "25mm" :side "200mm")) :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :summary "2 x 11 in (280mm) Dahlgren smoothbores, turret" :level "4"))))))) "Victorian England" (chapter :name "Victorian England" :sectionmap (sectionmap "Victoraian Characters" (section :name "Victoraian Characters" :unitmap (unitmap "Dr. John Watson" (unit :name "Dr. John Watson") "Herbert George Wells" (unit :name "Herbert George Wells") "Jack the Ripper" (unit :name "Jack the Ripper") "Sherlock Holmes" (unit :name "Sherlock Holmes" :reference "* Watson: What made like this? * Sherlock: Oh, dear Watson. Nothing made me ... I made me."))))) "Wild West" (chapter :name "Wild West" :sectionmap (sectionmap "Steam Age Tycoons" (section :name "Steam Age Tycoons" :unitmap (unitmap :Banker (unit :name "Banker") "Land Baron" (unit :name "Land Baron" :reference "All I hear from you...is how poor you are; how you can't afford my taxes. Yet somehow, you managed to find the money to hire a gunfighter to kill me. If ya got so much money, I'm just gonna have to take some more. - John Herod, The Quick and the Dead" :unitskillmap (unitskillmap :Intimidation (unitskill :name "Intimidation" :level "5") :Firearms (unitskill :name "Firearms" :level "4" :unititemmap (unititemmap ".45 Colt Peacemaker" (unititem :name ".45 Colt Peacemaker"))) :Evasion (unitskill :name "Evasion" :level "4"))) "Oil Baron" (unit :name "Oil Baron") "Railroad Tycoon" (unit :name "Railroad Tycoon"))))) "Examples of Play" (chapter :name "Examples of Play" :sectionmap (sectionmap "Western Gunfight" (section :name "Western Gunfight" :summary "Round 1 - Turn 1 Initiative Gunslinger player starts with the initiative, but the Marshall wants to 'Take the Initiative' Each Player rolls 2 dice. +1 for the player who currently holds initiative. +1 for highest skill. -1 if most Damaged or Stunned. A tie means simultaneous actions. Gunslinger rolls 6 + 1 (holds initiative) = 7. Marshall rolls 8. Marshall takes the initiative. Move Marshall is within range of his weapon, so chooses not to move to get the best chance to hit. Action Fast Draw - Marshall is in weapon range and chooses to use Fast Draw to draw his weapon and fire. Attack - Fast Draw was a Free Action and Marshall chooses to fire. He uses his Handgun Skill and any modifiers to determine attack dice. 5 (Handguns) +1 (Accuracy) - 1 (Hip Shoot) = 6 Dice Marshall rolls 6 dice and gets 1 (miss), 2 (miss), 2 (miss), 3 (miss), 5 (hit), and 6 (hit and bonus die). He rolls the bonus die and gets another 6 (critical hit and bonus die). He rolls the bonus die and gets a 3 (flag). Marshall's total roll is 1 hit, 1 critical, and a flag. Defense Gunslinger now rolls dice equal to appropriate defense: 4 Body = 4 Dice Gunslinger rolls 3 dice and gets 1 (miss), 3 (miss), 5 (hit), and 6 (hit and bonus die). He rolls the bonus die and gets a 4 (critical hit). Gunslinger's total is 2 hits and 1 critical. Gunslinger's 1 hit cancels one of Marshall's hits and his 1 critical hit cancels one of Marshall's critical hits. This leaves Marshall with only a single flag, Gunslinger had rolled a second hit, but since it can only cancel other hits, it has no effect. Effects Flags - Gunslinger gains a Flag Token and must retreat one space for each flag. He therefore retreats 1 space away from Marshall. Attack Damage - Since no damage was rolled, Marshall's turn is over. Round 1 - Turn 2 Initiative Gunslinger player regains the initiative. Marshall has already taken a turn and cannot do so again this round. White Tokens - After initiative is determined, Gunslinger must remove a White Token if any. He removes the Flag token. Move Gunslinger was forced to back by the Flag but is still in his weapon's range, so he will not take an attack penalty. However, if he moves closer he will take a penalty for moving, so he opts to stay still and fire. Action Fast Draw - Gunslinger also uses Fast Draw to draw and fire. Attack - He uses his Handgun Skill and any modifiers to determine attack dice. 5 (Handguns) +1 (Accuracy) -1 (Hip Shoot) = 5 Dice. Gunslinger rolls 5 dice and gets 1 (miss), 3 (miss), 4 (hit), 5 (hit), and 5 (hit). His total roll is 3 hits. Nice. Defense Marshall now rolls dice equal to appropriate defense. 4 Body = 4 Dice. Marshall rolls 4 dice and gets 1 (miss), 1 (miss), 3 (miss), and 4 (hit). Marshall's total is 1 hit. Marshall cancels 1 of Gunslinger's hits. This leaves Gunslinger with 2 hits. Effects Damage Rating - Since Gunslinger rolled at least 1 hit or critical hit (he scored 2), he checks the damage rating of his Schofield .45. Its damage rating is 4. If Gunslinger had rolled less than 4 dice, the Schofield would allow him to roll the difference in additional damage dice. However, Gunslinger rolled 4 dice already, so he receives no additional dice. Hits - The first hit is converted to a Stun Token. Damage - All subsequent hits are converted to Damage Tokens. Damage Summary - 1 Stun Token and 1 Damage Token. Hit Location - Since we are using Hit Location and did some form of damage, roll 2 dice. The first determines side of the body: 1-2 is left side, 3-4 is center, and 5-6 is right side. The second die determines height on the body: 1-2 is low, 3-4 is middle, 5-6 is high. Marshall rolls 6 (right), 2 (low): Right Shin/Foot. The 1 Damage Token is therefore on Marshall's Right Shin. This will limit his movement. Turn End Round End - Since all units have acted, the round ends. Round 2 - Turn 1 Initiative Marshall has the initiative since Gunslinger player ended with the initiative, but Gunslinger predictably wants to 'Take the Initiative' back. Marshall desperately needs to win initiative to recover a bit from the last hit. Each Player rolls 2 dice. +1 for the player who currently holds initiative. +1 for highest skill. -1 if most Damaged or Stunned. A tie means simultaneous actions. Marshall rolls 4 + 1 (holds initiative) -1 (most Damaged) = 4. Gunslinger rolls 8 and takes the initiative. Gunslinger grins. White Tokens - Gunslinger has no White Tokens. Move Gunslinger presses his advantage and stays and fires hoping to finish this battle. Action Since their guns are already drawn, neither unit needs to fire from the hip anymore. Attack - Gunslinger determines attack dice. 5 (Handguns) +1 (Accuracy) = 6 Dice. Gunslinger rolls 6 dice and gets 1 (miss), 1 (miss), 3 (miss), 5 (hit), 5 (hit), and 6 (hit and bonus die). He rolls the bonus and gets 1 (flag). His total roll is 3 hits and a flag. Looking good. Defense Marshall now rolls dice equal to appropriate defense. 4 Body -1 (Damage) -1 (Stun) = 2 Dice. Need some good rolls about now. Marshall rolls 2 dice and gets 1 (miss) and 1 (miss). Nothing. Marshall is hit dead-on by the Gunslinger. Effects Damage Rating - Since Gunslinger rolled at least 1 hit or critical hit (he scored 3), he checks the damage rating of his Schofield .45. Its damage rating is 4 is not more than his 6 dice rolled so no additional dice. Hits - The first hit is converted to a Stun Token. Damage - All subsequent hits are converted to Damage Tokens. Damage Summary - 1 Stun Token and 2 Damage Tokens. Hit Location - Since we are using Hit Location and did some form of damage, roll 2 dice. The first determines side of the body: 1-2 is left side, 3-4 is center, and 5-6 is right side. The second die determines height on the body: 1-2 is low, 3-4 is middle, 5-6 is high. Marshall rolls 2 (left), 4 (center): Left Thigh. The 2 Damage Tokens are therefore on Marshall's Left Thigh. This will limit his movement even more. Damage Total - 2 Stun Tokens and 3 Damage Tokens (1 on Right Shin, 2 on Left Thigh). The total of -5 is greater than the Marshall's 4 Body, so he drops to the ground. Round 2 - Turn 2 Initiative Marshall has the initiative since Gunslinger has already acted this round. White Tokens - Marshall removes a White Token if any. He removes 1 of the Stun tokens. Move Marshall is prone and has no Move left to even crawl (Move 4 - 1 (Stun) - 3 (Damage)). Action Marshall could attack with 5 (Handguns) + 1 (Accuracy) - 1 (Stun) - 3 (Damage) = 2 Dice, but he has no dice to defend next turn, he is Prone (+1) and Helpless (+1) for a total of 8 Gunslinger Dice against his own 0 Dice. What's more the gunslinger doesn't have a scratch on him. The duel is clearly over, and the Marshall drops his gun and begs for his life."))))))
nx/tactics/books/age_of_steam / tacticsbook
Description:
Function Name:
  • tacticsbook
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func tacticsbook : base/book (book :name "Age of Steam" :image "WildWest.jpg" :chaptermap (chaptermap "Age of Steam Overview" (chapter :name "Age of Steam Overview" :sectionmap (sectionmap "Age of Steam Naval Warfare" (section :name "Age of Steam Naval Warfare" :summary "* Wind * Large Ships * Small Ships * Solid Shot * Burning Shot * Chain Shot"))) "Age of Steam Equipment" (chapter :name "Age of Steam Equipment" :sectionmap (sectionmap "Steam Age Vehicles" (section :name "Steam Age Vehicles" :unitmap (unitmap "Horseless Carriage" (unit :name "Horseless Carriage") "Mailplane Biplane" (unit :name "Mailplane Biplane") "Ocean Liner" (unit :name "Ocean Liner" :titles "Liner, Steam Liner") :Stagecoach (unit :name "Stagecoach") "Steam Ferry" (unit :name "Steam Ferry") "Steam Train Boxcar" (unit :name "Steam Train Boxcar") "Steam Train Caboose" (unit :name "Steam Train Caboose") "Steam Train Coach" (unit :name "Steam Train Coach") "Steam Train Locomotive" (unit :name "Steam Train Locomotive") "Steam Train Private Coach" (unit :name "Steam Train Private Coach") :Steamboat (unit :name "Steamboat") "Tramp Freighter" (unit :name "Tramp Freighter") :Zepplin (unit :name "Zepplin" :titles "Dirigible"))))) "Steam Age Maps" (chapter :name "Steam Age Maps" :sectionmap (sectionmap "Steam Age Terrain" (section :name "Steam Age Terrain" :rulemap (rulemap :Mine (rule :name "Mine") :Tumbleweed (rule :name "Tumbleweed") "Western Town" (rule :name "Western Town"))))) "Civil War" (chapter :name "Civil War" :sectionmap (sectionmap "Union Navy" (section :name "Union Navy" :unitmap (unitmap "USS Monitor" (unit :name "USS Monitor" :speed "15kph" :classification "Hvy. Naval Vessel" :crew "59" :mass "1000tons" :length "52m" :unitpowermap (unitpowermap :Armor (unitpower :name "Armor" :summary "200mm iron turret, 25mm deck, 125mm hull belt" :front "200mm" :back "200mm" :over "25mm" :side "200mm")) :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :summary "2 x 11 in (280mm) Dahlgren smoothbores, turret" :level "4"))))))) "Victorian England" (chapter :name "Victorian England" :sectionmap (sectionmap "Victoraian Characters" (section :name "Victoraian Characters" :unitmap (unitmap "Dr. John Watson" (unit :name "Dr. John Watson") "Herbert George Wells" (unit :name "Herbert George Wells") "Jack the Ripper" (unit :name "Jack the Ripper") "Sherlock Holmes" (unit :name "Sherlock Holmes" :reference "* Watson: What made like this? * Sherlock: Oh, dear Watson. Nothing made me ... I made me."))))) "Wild West" (chapter :name "Wild West" :sectionmap (sectionmap "Steam Age Tycoons" (section :name "Steam Age Tycoons" :unitmap (unitmap :Banker (unit :name "Banker") "Land Baron" (unit :name "Land Baron" :reference "All I hear from you...is how poor you are; how you can't afford my taxes. Yet somehow, you managed to find the money to hire a gunfighter to kill me. If ya got so much money, I'm just gonna have to take some more. - John Herod, The Quick and the Dead" :unitskillmap (unitskillmap :Intimidation (unitskill :name "Intimidation" :level "5") :Firearms (unitskill :name "Firearms" :level "4" :unititemmap (unititemmap ".45 Colt Peacemaker" (unititem :name ".45 Colt Peacemaker"))) :Evasion (unitskill :name "Evasion" :level "4"))) "Oil Baron" (unit :name "Oil Baron") "Railroad Tycoon" (unit :name "Railroad Tycoon"))))) "Examples of Play" (chapter :name "Examples of Play" :sectionmap (sectionmap "Western Gunfight" (section :name "Western Gunfight" :summary "Round 1 - Turn 1 Initiative Gunslinger player starts with the initiative, but the Marshall wants to 'Take the Initiative' Each Player rolls 2 dice. +1 for the player who currently holds initiative. +1 for highest skill. -1 if most Damaged or Stunned. A tie means simultaneous actions. Gunslinger rolls 6 + 1 (holds initiative) = 7. Marshall rolls 8. Marshall takes the initiative. Move Marshall is within range of his weapon, so chooses not to move to get the best chance to hit. Action Fast Draw - Marshall is in weapon range and chooses to use Fast Draw to draw his weapon and fire. Attack - Fast Draw was a Free Action and Marshall chooses to fire. He uses his Handgun Skill and any modifiers to determine attack dice. 5 (Handguns) +1 (Accuracy) - 1 (Hip Shoot) = 6 Dice Marshall rolls 6 dice and gets 1 (miss), 2 (miss), 2 (miss), 3 (miss), 5 (hit), and 6 (hit and bonus die). He rolls the bonus die and gets another 6 (critical hit and bonus die). He rolls the bonus die and gets a 3 (flag). Marshall's total roll is 1 hit, 1 critical, and a flag. Defense Gunslinger now rolls dice equal to appropriate defense: 4 Body = 4 Dice Gunslinger rolls 3 dice and gets 1 (miss), 3 (miss), 5 (hit), and 6 (hit and bonus die). He rolls the bonus die and gets a 4 (critical hit). Gunslinger's total is 2 hits and 1 critical. Gunslinger's 1 hit cancels one of Marshall's hits and his 1 critical hit cancels one of Marshall's critical hits. This leaves Marshall with only a single flag, Gunslinger had rolled a second hit, but since it can only cancel other hits, it has no effect. Effects Flags - Gunslinger gains a Flag Token and must retreat one space for each flag. He therefore retreats 1 space away from Marshall. Attack Damage - Since no damage was rolled, Marshall's turn is over. Round 1 - Turn 2 Initiative Gunslinger player regains the initiative. Marshall has already taken a turn and cannot do so again this round. White Tokens - After initiative is determined, Gunslinger must remove a White Token if any. He removes the Flag token. Move Gunslinger was forced to back by the Flag but is still in his weapon's range, so he will not take an attack penalty. However, if he moves closer he will take a penalty for moving, so he opts to stay still and fire. Action Fast Draw - Gunslinger also uses Fast Draw to draw and fire. Attack - He uses his Handgun Skill and any modifiers to determine attack dice. 5 (Handguns) +1 (Accuracy) -1 (Hip Shoot) = 5 Dice. Gunslinger rolls 5 dice and gets 1 (miss), 3 (miss), 4 (hit), 5 (hit), and 5 (hit). His total roll is 3 hits. Nice. Defense Marshall now rolls dice equal to appropriate defense. 4 Body = 4 Dice. Marshall rolls 4 dice and gets 1 (miss), 1 (miss), 3 (miss), and 4 (hit). Marshall's total is 1 hit. Marshall cancels 1 of Gunslinger's hits. This leaves Gunslinger with 2 hits. Effects Damage Rating - Since Gunslinger rolled at least 1 hit or critical hit (he scored 2), he checks the damage rating of his Schofield .45. Its damage rating is 4. If Gunslinger had rolled less than 4 dice, the Schofield would allow him to roll the difference in additional damage dice. However, Gunslinger rolled 4 dice already, so he receives no additional dice. Hits - The first hit is converted to a Stun Token. Damage - All subsequent hits are converted to Damage Tokens. Damage Summary - 1 Stun Token and 1 Damage Token. Hit Location - Since we are using Hit Location and did some form of damage, roll 2 dice. The first determines side of the body: 1-2 is left side, 3-4 is center, and 5-6 is right side. The second die determines height on the body: 1-2 is low, 3-4 is middle, 5-6 is high. Marshall rolls 6 (right), 2 (low): Right Shin/Foot. The 1 Damage Token is therefore on Marshall's Right Shin. This will limit his movement. Turn End Round End - Since all units have acted, the round ends. Round 2 - Turn 1 Initiative Marshall has the initiative since Gunslinger player ended with the initiative, but Gunslinger predictably wants to 'Take the Initiative' back. Marshall desperately needs to win initiative to recover a bit from the last hit. Each Player rolls 2 dice. +1 for the player who currently holds initiative. +1 for highest skill. -1 if most Damaged or Stunned. A tie means simultaneous actions. Marshall rolls 4 + 1 (holds initiative) -1 (most Damaged) = 4. Gunslinger rolls 8 and takes the initiative. Gunslinger grins. White Tokens - Gunslinger has no White Tokens. Move Gunslinger presses his advantage and stays and fires hoping to finish this battle. Action Since their guns are already drawn, neither unit needs to fire from the hip anymore. Attack - Gunslinger determines attack dice. 5 (Handguns) +1 (Accuracy) = 6 Dice. Gunslinger rolls 6 dice and gets 1 (miss), 1 (miss), 3 (miss), 5 (hit), 5 (hit), and 6 (hit and bonus die). He rolls the bonus and gets 1 (flag). His total roll is 3 hits and a flag. Looking good. Defense Marshall now rolls dice equal to appropriate defense. 4 Body -1 (Damage) -1 (Stun) = 2 Dice. Need some good rolls about now. Marshall rolls 2 dice and gets 1 (miss) and 1 (miss). Nothing. Marshall is hit dead-on by the Gunslinger. Effects Damage Rating - Since Gunslinger rolled at least 1 hit or critical hit (he scored 3), he checks the damage rating of his Schofield .45. Its damage rating is 4 is not more than his 6 dice rolled so no additional dice. Hits - The first hit is converted to a Stun Token. Damage - All subsequent hits are converted to Damage Tokens. Damage Summary - 1 Stun Token and 2 Damage Tokens. Hit Location - Since we are using Hit Location and did some form of damage, roll 2 dice. The first determines side of the body: 1-2 is left side, 3-4 is center, and 5-6 is right side. The second die determines height on the body: 1-2 is low, 3-4 is middle, 5-6 is high. Marshall rolls 2 (left), 4 (center): Left Thigh. The 2 Damage Tokens are therefore on Marshall's Left Thigh. This will limit his movement even more. Damage Total - 2 Stun Tokens and 3 Damage Tokens (1 on Right Shin, 2 on Left Thigh). The total of -5 is greater than the Marshall's 4 Body, so he drops to the ground. Round 2 - Turn 2 Initiative Marshall has the initiative since Gunslinger has already acted this round. White Tokens - Marshall removes a White Token if any. He removes 1 of the Stun tokens. Move Marshall is prone and has no Move left to even crawl (Move 4 - 1 (Stun) - 3 (Damage)). Action Marshall could attack with 5 (Handguns) + 1 (Accuracy) - 1 (Stun) - 3 (Damage) = 2 Dice, but he has no dice to defend next turn, he is Prone (+1) and Helpless (+1) for a total of 8 Gunslinger Dice against his own 0 Dice. What's more the gunslinger doesn't have a scratch on him. The duel is clearly over, and the Marshall drops his gun and begs for his life."))))))
nx/tactics/books/bestiary
Description:
Package Name:
  • nx/tactics/books/bestiary
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
Functions:
  • tacticsbook
Source Code:
  • (package nx/tactics/books/bestiary :libs (lib base :path nx/tactics/base)) (func tacticsbook : base/book (book :name "Bestiary" :image "FloraAndFauna.jpg" :chaptermap (chaptermap "Bestiary Overview" (chapter :name "Bestiary Overview" :sectionmap (sectionmap "Why Tactics: Bestiary?" (section :name "Why Tactics: Bestiary?"))) :Amphibians (chapter :name "Amphibians" :sectionmap (sectionmap "Fantastic Amphibians" (section :name "Fantastic Amphibians" :unitmap (unitmap "Frog, Giant" (unit :name "Frog, Giant") "Toad, Giant" (unit :name "Toad, Giant") "Toad, Giant Poisonous" (unit :name "Toad, Giant Poisonous"))))) :Arthropods (chapter :name "Arthropods" :sectionmap (sectionmap "Fantastic Arthropods" (section :name "Fantastic Arthropods" :unitmap (unitmap "Ant, Giant" (unit :name "Ant, Giant") "Ant, Huge" (unit :name "Ant, Huge") "Ant, Huge Fire" (unit :name "Ant, Huge Fire") "Ant Lion, Giant" (unit :name "Ant Lion, Giant") "Ant Lion, Huge" (unit :name "Ant Lion, Huge") "Beetle, Giant" (unit :name "Beetle, Giant") "Beetle, Giant Pincher" (unit :name "Beetle, Giant Pincher") "Beetle, Giant Rinoceros" (unit :name "Beetle, Giant Rinoceros") "Beetle, Hugh" (unit :name "Beetle, Hugh") "Beetle, Hugh Fire" (unit :name "Beetle, Hugh Fire") "Caterpillar, Giant" (unit :name "Caterpillar, Giant") "Centipede, Giant" (unit :name "Centipede, Giant") "Centipede, Hugh Poisonous" (unit :name "Centipede, Hugh Poisonous") "Cockroach, Giant" (unit :name "Cockroach, Giant") "Dragonfly, Giant" (unit :name "Dragonfly, Giant") "Dragonfly, Huge" (unit :name "Dragonfly, Huge") "Fire Bug" (unit :name "Fire Bug") "Firefly, Huge" (unit :name "Firefly, Huge") "Lightning Bug, Huge" (unit :name "Lightning Bug, Huge") "Mantis, Giant" (unit :name "Mantis, Giant") "Mantis, Huge" (unit :name "Mantis, Huge") "Mosquito, Giant" (unit :name "Mosquito, Giant") "Mosquito, Huge" (unit :name "Mosquito, Huge") "Scarab, Huge" (unit :name "Scarab, Huge") "Scorpion, Giant" (unit :name "Scorpion, Giant") "Scorpion, Huge" (unit :name "Scorpion, Huge") "Spider, Giant" (unit :name "Spider, Giant") "Spider, Huge" (unit :name "Spider, Huge") "Spider, Huge Spitting" (unit :name "Spider, Huge Spitting") "Spider, Huge Trap Door" (unit :name "Spider, Huge Trap Door") "Spider, Huge Water" (unit :name "Spider, Huge Water") "Spider, Phase" (unit :name "Spider, Phase" :titles "Dimension Spider") :Vasp (unit :name "Vasp" :summary "* The Vasp is a giant predatory insectoid. They stand 10 feet tall with segmented bodies covered with metallic scales. Despite their size and ungainly appearance, they are surprisingly quick and can leap 30 feet. * Vasps are solitary nocturnal creatures that usually attack by leaping on its victim, pining it to the ground, and stinging it to death with its tail. Its stinger exudes a caustic venom that slowly dissolves the internal organs. While the toxin is taking effect, the Vasp wraps it prey in a silky cocoon and drags it back to its lair." :mass "250kg" :height "3m") "Wasp, Huge" (unit :name "Wasp, Huge") "Wasp, Parasite" (unit :name "Wasp, Parasite") "Worm, Giant" (unit :name "Worm, Giant") "Worm, Giant Sand" (unit :name "Worm, Giant Sand"))))) :Avians (chapter :name "Avians" :sectionmap (sectionmap "Fantastic Avians" (section :name "Fantastic Avians" :unitmap (unitmap :Hekler (unit :name "Hekler" :summary "* The Hekler is a pestiferous variety of bird identified by its spiked plummage and awful, shrill cry they produce when hungry. Heklers have the annoying habit of following travellers scrounging for handouts and leftovers. They are extremely persistent and will pursue their victims for miles, swawking incessently. Worse, the call is audible for two miles and is known to attract predatory beasts. If fed, they become silent while they eat, providing an opportunity to escape." :titles "Nag-Bird") "Iron Shrike" (unit :name "Iron Shrike" :summary "* A long beaked bird with metallic plumage. Their metallic feathers make them very hardy but also poor flyers. They hunt by diving at full speed from high altitudes and impaling their prey on their dagger-like beaks.") "Sky Jelly" (unit :name "Sky Jelly") "Sky Pufferfish" (unit :name "Sky Pufferfish") "Sky Shark" (unit :name "Sky Shark") "Sky Squid" (unit :name "Sky Squid") :Skyfish (unit :name "Skyfish" :summary "* Skyfish have developed their flotation bladders to hold lighter than air gases. Their bodies and bones are porous and very lightweight, so they are somewhat more vulnerable to impact damage. If their flotation bladder is ruptured, they will sink. Some skyfish have adapted to live at very high altitudes to avoid predators.") "Winged Viper" (unit :name "Winged Viper" :summary "* A snake with feathered wings and a mildly poisonous bite. They are generally small but can grow to 10 feet. They feed on small creatures, but will attack larger targets when hungry or disturbed."))))) :Mammals/Marsupials (chapter :name "Mammals/Marsupials" :sectionmap (sectionmap "Fantastic Mammals" (section :name "Fantastic Mammals" :unitmap (unitmap "Bat, Huge" (unit :name "Bat, Huge") "Boar, Great" (unit :name "Boar, Great") "Ferret, Keen" (unit :name "Ferret, Keen" :summary "* These furred scavengers are hoarders and theives by nature robbing nests and homes alike. They have uncanny manual dexterity and are natural thieves able to squeeze into tight places, evade detection, and untie knots. * If caputured at infancy, they can be raised as pets and taught to steal for its master. For this reason, they are valuable to professional thieves. * With training they can be taught to pick pockets and even pick simple locks." :mass "2kg" :length ".5m") "Rat, Bog" (unit :name "Rat, Bog") "Rat, Crypt" (unit :name "Rat, Crypt") "Rat, Plague" (unit :name "Rat, Plague") :Terrorphant (unit :name "Terrorphant" :summary "* A giant, carnivorous elephant. An evily, intelligent alpha predator.") :Terrorpotmus (unit :name "Terrorpotmus" :summary "* A giant, carnivorous hippopotamus. An keenly intelligent alpha predator.") "Wolf, Dire" (unit :name "Wolf, Dire") "Wolf, Warg" (unit :name "Wolf, Warg") "Wolverine, Huge" (unit :name "Wolverine, Huge"))))) "Marine Creatures" (chapter :name "Marine Creatures" :sectionmap (sectionmap "Fantastic Marine Creatures" (section :name "Fantastic Marine Creatures" :unitmap (unitmap "Crab, Giant" (unit :name "Crab, Giant") "Maray Eel, Giant" (unit :name "Maray Eel, Giant" :summary "* Giant, sightless eels native to deep undersea caves and grottos. These aggressive predators measure over 20 feet and have rows of sharp jagged teeth." :titles "Kra") "Kingfisher, Giant" (unit :name "Kingfisher, Giant") "Lamprey, Huge" (unit :name "Lamprey, Huge") "Octopus, Giant" (unit :name "Octopus, Giant") "Red Tide" (unit :name "Red Tide") "Sea Serpent" (unit :name "Sea Serpent") "Seahorse, Huge" (unit :name "Seahorse, Huge") "Shark, Megalodon" (unit :name "Shark, Megalodon"))))) :Reptiles (chapter :name "Reptiles" :sectionmap (sectionmap "Fantastic Reptiles" (section :name "Fantastic Reptiles" :unitmap (unitmap :Balizard (unit :name "Balizard" :summary "* A large, magical variety of lizard that survives in arctic climates. Its body temperature matches the surrounding. It has a special form of gaze ability where it can draw heat from any target it is facing into its nose and mouth. It uses this ability to freeze opponents before eating their icy remains.") "Crocodile, Giant" (unit :name "Crocodile, Giant") "Desert Strider" (unit :name "Desert Strider" :summary "* Striders are large bipedal desert creatures resembling a cross between a lizard and a flightless bird. Striders are perfectly acclimated to desert life. They can go for months without water, have protective lenses over their eyes, and actually process sunlight to supplement the insects and reptiles they normally consume. Conversely, they cannot survive outside a desert environment.") "Lizard, Giant" (unit :name "Lizard, Giant") "Serpent, Great" (unit :name "Serpent, Great") "Snake, Crypt Cobra" (unit :name "Snake, Crypt Cobra") "Snake, Swaying Cobra" (unit :name "Snake, Swaying Cobra" :summary "* This seemingly normal Cobra has the enhanced ability to hypnotise its victim. * Hypnotism - By slowly swaying back and forth and removing all hostile intent from its mind, the Cobra creates the illusion that it is peaceful and harmless. Its victim becomes enthralled and simply watches as the Cobra slowly advances. When the Cobra is face to face with its victim, it attacks with lightning speed to bite the face or throat to deposit its venom near the victim's brain." :titles "Hypnotic Cobra") "Tortoise, Giant" (unit :name "Tortoise, Giant"))))) :Plants (chapter :name "Plants" :sectionmap (sectionmap "Fantastic Plants" (section :name "Fantastic Plants" :itemmap (itemmap "Black Lotus" (item :name "Black Lotus" :image "Fantasy/BlackLotus.jpg" :reference "* Blue Lotus - Recent studies have shown Nymphaea caerulea to have psychedelic properties, and may have been used as a sacrament in ancient Egypt and certain ancient South American cultures. Dosages of 5 to 10 grams of the flowers induces slight stimulation, a shift in thought processes, enhanced visual perception, and mild closed-eye visuals." :summary "* Black Lotus is a medium sized blue/black flower that has strong hallucinogenic and magical properties. Eating the petals of the Lotus creates pleasant hallucinations that are strongly addictive over time. The greatest danger of eating lotus petals is that the potency grows from mild euphoria at the tip of the petal to intense hallucinations, madness, and death near the flower. The trick is to only eat the amount that will give you the effect you desire, but the flower is hard to get and the temptation is strong to go back for more. The desperately addicted Lotus-Eaters eventually use too much and go mad or die. * Black Lotus grows only in deep swamps such as those near the city of [Fiaqua] (the Flower on the Water) and must be cultivated to gain its full potential. The Lotus retains its potency for about a month after picking, but the petals wither shortly after being removed, so the flower is typically kept intact despite the dangers.") "Black Rose" (item :name "Black Rose" :reference "* The Black Rose blooms once more! - LeBlanc, Runeterra * Another rose for the garden. - LeBlanc, Runeterra" :summary "* Black roses have often been associated with mystery, hatred, death, dishonor, tragic romance, and the supernatural in different cultures and traditions. In literature and art, they frequently symbolize tragic love or the darker aspects of human emotions. Despite their associations with darkness, black roses can also convey elegance, sophistication, and rebirth in some contexts. This dual symbolism has contributed to their enduring allure and cultural significance." :titles "Rosa Black Baccara") :Devilroot (item :name "Devilroot" :summary "* A rare species of plant recognizable by its forked leaves and crimson forked root. The powdered root is a deadly poison.") :K'Tallah (item :name "K'Tallah" :summary "* A rare swamp plant with gray-green leaves. It is also a highly addictive euphoric that can provide visions of the near future. After a half dozen uses, the user becomes hopelessly addicted and must consume a leaf each day or suffer horrible and ultimately fatal consequences. The first symptoms are stomach pains and the uneasy feeling that some is growing within. Next the snakelike tentrils of new K'Tallah plants sprout from the eyes, ears, and mouth. Death follows quickly. Heavy users, arguably the most wretched folk in existence, claim that leaves plucked from the body of a deceased addict are especially savory.") :Mandrake (item :name "Mandrake" :summary "* A long leaved (nearly a foot long) dark green plant with small greenish-yellow or purple bell-shaped flowers that grow on 3-4 inch stalks. It is best known for the large brown root, running 3 to 4 feet into the ground sometimes single and sometimes forked into two or three distinctive branches which gives the plant a rough resemblance to that of a human monster form. * It was supposed to grow under the feet of a hanged man where his semen dripped on to the earth; this would appear to be the reason for the methods employed by the alchemists who 'projected human seed into animal earth'. It could only be pulled from the ground after performing the necessary rituals. It was advisable to put wax in the ears before one attempted to do this: the mandrake would scream when pulled free and this could cause deafness. * A whole Mandrake root placed in the home, will give the house protection, fertility, and prosperity. Also, where there is Mandrake, demons cannot abide. Money placed beside the root is said to multiply. It was also recommended for discovering treasures, and as an ingredient for charm for pregnancy.") :Morphious (item :name "Morphious" :summary "* A parasitic plant that grows amidst the branches of trees and bushes. The frangrance it produces causes intoxication, drowsiness, and sleep. Those who fall asleep under Morphious will not awake while they can smell the lovely Morphious. Eventually, they die and decompose feeding the plants that the Morphious preys upon. Morpious can be distilled into even more potent intoxicants, sleeping potions and powers." :titles "Euphorica, Mantrap") :Skullcap (item :name "Skullcap" :summary "* A powerful hallucinogenic mushroom with a bone-white cap. It is said to be the cause of the Wildmen's irrational behavior. * Ingesting small amounts cause highly irrational and often violent behavior. Consuming a full dram is usually fatal in minutes.") "Snow Lily" (item :name "Snow Lily" :summary "* A delicate white flower that grows only in the coldest climates. * Consuming it delays the onset of frostbite. Brewed into an elixir, it allows the consumer's body temperature to fall to below freezing with no ill effects.") :Stranglevine (item :name "Stranglevine") :Stenchroot (item :name "Stenchroot" :summary "* A tuber with horribly, noxious smelling sap. When gathered into clay pots, the Stenchroot sap can make nausea inducing grenades.") :Tantalus (item :name "Tantalus" :summary "* A small leafy plant wih a tuberous, heart-shaped root. A powder formed from the dried root can make a powerful aphrodisiac.")) :unitmap (unitmap :Arborian (unit :name "Arborian" :titles "Treefolk, Verdure") :Creep (unit :name "Creep" :summary "* The Creep is a vine growth that lives in [Jungle] Terrain that is not hostile per se, but it's aggressive growth can surround, entrap, and immobilize even giant creatures over time. It often lives in symbiosis with opportunist predators. Fortunately, the Creep only grows during the day.") "Creeping Mold" (unit :name "Creeping Mold" :reference "* I'm a goner already, Daddy. Ain't I? I've got that stuff out of the meteor on me... and I'm gone. Ain't I? - Jordy, Creepshow") :Deadwood (unit :name "Deadwood" :summary "* A corrupted spirit that resembles a twisted humanoid composed of dead decaying wood. Deadwood is created when a woodland area is exposed to powerful corruption. Once established in an area, it begins to absorb life energies from all living creatures around it. All vegetation around will become warped and withered. Living creatures will fall sick developing strange ailments. Meanwhile, the Deadwood grows in power. * Deadwood can control plant life and unliving wood. They cannot be destroyed except by enchanted weapons, fire, or by starving it by destroying the surrounding plant life." :titles "Plant Demon, Wood Grue") "Giant Fisher Plant" (unit :name "Giant Fisher Plant" :summary "* A huge creeper vine plant that covers mulitple nearby trees and has enormous blossoms hanging from high branches. The plant attacks living creatures by dropping vines from the bottom of the blossums that entwine and drag prey into the canaopy above where they die of strangulation or dehydration and are eventually digested. Bones and bits of carcass are dropped below to lure more prey.") :Shambler (unit :name "Shambler" :summary "* An animated pile of decaying vegetation.") :Slime (unit :name "Slime") "Strangle Vine" (unit :name "Strangle Vine" :summary "* A large, creeper vine that waits attacks like a constrictor snake. They typically hang in jungles or caves and strike from above or slowly entwine immobile (e.g. sleeping) targets on the ground.") :Triffid (unit :name "Triffid") "Venus Flytrap, Giant" (unit :name "Venus Flytrap, Giant"))))) :Microorganisms (chapter :name "Microorganisms" :sectionmap (sectionmap "Fantastic Diseases" (section :name "Fantastic Diseases" :itemmap (itemmap "Corpse Rot" (item :name "Corpse Rot" :summary "* Disease transmitted by the bite of Ghouls/Necrophages. Symptoms include fever, severe weakness, unconsciousness, and a gradual blackening and swelling of the limbs starting at the site of the wound and spreading across the body. The disease only affects humans") "Swamp Fever" (item :name "Swamp Fever" :summary "* A water-borne disease appearing only in hot weather. It causes irrational behavior, constant thirsting and a tendency to lean to one side while walking or standing. The irrational behavior gradually becomes permanent raving madness.") :Yakuk (item :name "Yakuk" :summary "* A disease common in jungle regions, it causes the gradual loss of sight, hearing, smell, taste, and speech, one at a time over a 2 week period. The effect becomes permanent but is not fatal, though the sensory deprivation usually ends in madness.") "Yellow Tinge" (item :name "Yellow Tinge" :summary "* An infectious disease that affects water breathers. The victim's gills slowly become clogged with a sticky, yellow secretion that interferes with breathing can kill if not treated."))))) "Underground Creatures" (chapter :name "Underground Creatures" :sectionmap (sectionmap "Fantastic Underground Creatures" (section :name "Fantastic Underground Creatures" :unitmap (unitmap "Bore Worms" (unit :name "Bore Worms" :reference "* Bring me... the Bore Worms. No! Not the BORE WORMS! - Klytus and Princess Aura, Flash Gordon" :summary "* Small worms that dig through flesh as easily as earth. They are attracted to burrowing creatures.") "False Hydra" (unit :name "False Hydra" :summary "* An insane monster that grows under towns can erase memories. It is said that it is born of lies. Perhaps it is a [Curse].") "Land Eel, Giant" (unit :name "Land Eel, Giant" :summary "* Giant, sightless creatures related to the Giant Moray Eel, these creatures burrow underground." :titles "Land Kra") "Slug, Giant" (unit :name "Slug, Giant") "Snail, Giant" (unit :name "Snail, Giant") "Sand Worms" (unit :name "Sand Worms"))))) :Humanoids (chapter :name "Humanoids" :sectionmap (sectionmap :Humans (section :name "Humans" :unitmap (unitmap "Human Female" (unit :name "Human Female" :summary "* Their extra [Mind] represents their extra need to work the system instead of using force. * Their extra [Will] represents their ability to endure hardship without breaking." :mind "6:1" :will "6:1" :mass "60kg") "Human Male" (unit :name "Human Male" :mind "5:1" :will "5:1" :mass "80kg"))))) "Humanoids, Fantastic" (chapter :name "Humanoids, Fantastic" :summary "This book subscribes to a more nuanced version of humanoid creatures than the classic Elves and Dwarves: * Like Great Danes and Poodles are just dogs that have rapidly changed in the face of selective breeding, these beings are still human. * They have minor differences in abilities, but these are cultural. * In this book, their physical and cultural differences are meant to be analogies for modern cultural differences and intolerance. * Languages: ** Each nation has its own language. Most travellers learn many languages in addition to tradespeak. ** Tradespeak - Merchants have created this simple language to facilitate trade. It is a very limited language, but can be used for basic communication if there is no alternative. It uses a simple format with no plurals, conjegation or tense: {Adjective(s)} {Subject Noun} {Adverb(s)} {Verb} {Adjective(s)} {Object Noun}. Examples: Trustworthy me offer 10 healthy sheep. Honorable you please each pay 20 silver. ** Thieves' Cant - A variant on Tradespeak that emphasizes secret or silent communication to mask criminal activity." :sectionmap (sectionmap :Seraphim (section :name "Seraphim" :summary "* Aerie" :titles "Zephyr"))) :Beastmen (chapter :name "Beastmen" :sectionmap (sectionmap :Wildman (section :name "Wildman" :reference "Chewbacca" :summary "* The wildmen are close relatives to normal humans but have distinctly animalistic qualities including fur and fangs." :unitmap (unitmap "Jaka Manhunter" (unit :name "Jaka Manhunter" :summary "* The Jaka are a race of intelligent man-like beings with features resembling a cross between man, wolf, and panther. They are a striking people with sleek black fur and yellow/green eyes. * Personality - The Jaka are solitary beings, sullen and introspective in nature. They have been known to become steadfast companions to those they trust, but have also been known to become cold-blooded killers to those who cross them. * Lifestyle - They are cunning and have excellent senses, so they make are superb hunters. They typically live off the land but also trade their extra hides and animal parts for useful gear. Some have extended their tracking and hunting skills to become bounty hunters: tracking and capturing fugitives from justice and living off the bounty."))))) :Constructs (chapter :name "Constructs" :sectionmap (sectionmap :Phantasms (section :name "Phantasms" :summary "* Phantasms are created through powerful [Illusion]." :unitmap (unitmap "Phantasmal Force" (unit :name "Phantasmal Force") "Phantasmal Mount" (unit :name "Phantasmal Mount") "Phantasmal Monster" (unit :name "Phantasmal Monster") "Phantasm Warrior" (unit :name "Phantasm Warrior"))))) :Dragons (chapter :name "Dragons" :summary "* Morale - Normal * Units - Individuals * Dragons are ancient beings and remember the time, before men, when their kind ruled the world." :sectionmap (sectionmap "Monstrous Dragons" (section :name "Monstrous Dragons" :unitmap (unitmap :Apophis (unit :name "Apophis" :reference "Egyptian Mythology") :Ladon (unit :name "Ladon") "Midgard Serpent" (unit :name "Midgard Serpent" :reference "Norse Mythology") :Pytho (unit :name "Pytho") :Stoorworm (unit :name "Stoorworm") :Tiamat (unit :name "Tiamat" :reference "Babylonian Mythology" :titles "Avatar of Chaos, Avatar of the Wyrm, The Beast, Mother of All Life"))))) :Elementals (chapter :name "Elementals" :summary "* All summoned Elementals are tied to their summoning point. If at any time, the elemental cannot trace a continuous line through their element to the summoning point, they are immediately banished back to their home plane. This is easiest for Air and Earth Elementals and hardest for Water and Fire Elementals. The most straightforward way to leverage this weakness is to isolate the summoning point using a different element." :sectionmap (sectionmap "Water Elementals" (section :name "Water Elementals" :unitmap (unitmap "Hydro Essence" (unit :name "Hydro Essence" :summary "* A mindless, condensed blob of Hydro energy. * Since slimes store magical energy they are highly sought after by mages and alchemists." :titles "Hydro Slime, Hydrolon, Water Slime") :Naiad (unit :name "Naiad" :titles "Nereid, Nyad") :Undine (unit :name "Undine") "Water Elemental" (unit :name "Water Elemental") "Water Elemental Lord" (unit :name "Water Elemental Lord" :summary "* Greater Water Elementals are enormous creatures that can appear as a lake, a whirlpool, or a tidal wave. They have complete mastery over the Water, can perform any Water Power at maximum ability and can cancel any other being attempting to use Fire." :unitpowermap (unitpowermap :Water (unitpower :name "Water" :level "20"))) "Water Sprite" (unit :name "Water Sprite"))))) :Extra-Dimensional (chapter :name "Extra-Dimensional" :sectionmap (sectionmap :Mirrorlands (section :name "Mirrorlands" :unitmap (unitmap "Mirror Reflection" (unit :name "Mirror Reflection" :summary "* A Mirror Reflection is being from the Mirrorlands that has no personal definition but longs for the definition of others. To this end, they become a mirror image of another being and try to impersonate the person though they lack any memories of the original. It would be practical to dispose of the original, but they are always only a reflection so they would die as well.") "Mirror Shard" (unit :name "Mirror Shard" :summary "* A Mirror Shard is a weaker form of a [Mirror Reflection]. It copies some single aspect of the original but is otherwise an empty shell. This incompleteness drives them mad with desperation. They are always drawn to the those they copy and are usually irrationally destructive. * [Action] [Target]: The Mirror Shard becomes the same [Mass] as the target. Then choose one [Skill] or [Power] to copy. The Mirror Shard gains that Skill/Power and loses all other Skills and Powers. It [Body], [Mind], and [Will] are altered accordingly."))))) :Darkling (chapter :name "Darkling" :titles "Goblinoid" :sectionmap (sectionmap :Uruks (section :name "Uruks" :reference "* Cro-magnon Man, Goths, Huns, Mongols, Vandals * Seven Deadly Sins: Wrath" :summary "* Description - Uruks are a relatively primitive species of barrel-chested humanoids distantly related to Humans. They are sturdy and imposing figures, trained by hard labor and warfare since birth. They range in height from 5 feet to 7 feet tall and typically have yellowish/grey/green skin, red/black/brown eyes, and long black/grey/white hair. Their noses are flat and they have a notably large mouth with uneven teeth. * Personality - Uruks are typically violent, impatient, and crude. They take what they want by force and are difficult to bargain with. Their culture and leaders claim that they are destined to take over the world and take back all that has been taken from them. Now they are consumed with wrath and envy of the achievements of other races and other orc tribes. * Culture - Their civilization is still in a hunter/gatherer stage. They lack the patience and desire to read, cultivate crops, domesticate herd animals, or invent sophisticated equipment. They live a semi-nomadic existence depending on the availability of resources and the charisma of their leaders. Uruk 'kingdoms' are short lived. The race's genius for battle does not extend itself to statecraft, and their conquests inevitably collapse under a struggle for power between rival leaders. Uruk society is completely male dominated. Females are expected to find a male to support them and begin their life's purpose: breeding. Any female of breeding age that has no male protector is considered available to any male that chooses to take her and support her. Other cultures consider this to be rape. Uruks call it marriage. They extend this practice to captured females from other races. * Warfare - Uruks wage constant war on any group near them until they take what is 'rightfully' theirs. When warbands grow large enough, they spill down into neighboring settlements to rape, murder, raid, and pillage. These bands can take on the proportions of a large town or small city, and roll across the countryside leaving burning wreckage in their wake. * Language - Uruks speak the rough and unflattering Uruk tongue, which has no alphabet. Uruk culture and history is passed along in an oral tradition. * Morale - Normal * Preferred Skills - Melee, Rage * Units - Light Infantry, Light Spearmen, Light Archers, Light Cavalry, King * Factions - Skullsplitter, Bonegrinder" :titles "Orc" :unitmap (unitmap "Uruk Butcher" (unit :name "Uruk Butcher" :summary "* Orc Butchers deal in all things meat. They serve as cooks, surgeons, undertakers, and torturers. * They prefer cleavers, hand axes, and knives in combat.") "Uruk-hai Champion" (unit :name "Uruk-hai Champion" :titles "Brawler, Bodyguard") "Uruk Raider" (unit :name "Uruk Raider") "Uruk Shaman" (unit :name "Uruk Shaman" :summary "* Uruk Shamans teach that everything the Uruks once had was stolen by the other races, and urges them on to ever-greater acts of violence and revenge.") "Uruk Taskmaster" (unit :name "Uruk Taskmaster") "Uruk Veteran" (unit :name "Uruk Veteran") "Uruk War Chief" (unit :name "Uruk War Chief") "Uruk Warrior" (unit :name "Uruk Warrior" :image "Fantasy/Orc_Warrior.png" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee" :level "4") :Military (unitskill :name "Military" :level "3"))))))) "Giant Races" (chapter :name "Giant Races" :sectionmap (sectionmap :Titans (section :name "Titans" :unitmap (unitmap :Atlas (unit :name "Atlas") :Chronos (unit :name "Chronos" :titles "Yog-Sothoth") :Echidna (unit :name "Echidna" :summary "* Mother of Monsters * Children - Cerberus, Chimera, Ethon, Gorgon, Graeae, Gelonus, Ladon, Lernaean Hydra, Nemean Lion, Orthrus, Phaea, Scylla, Sphinx" :titles "Shub-Niggurath") :Gaia (unit :name "Gaia" :titles "Mother Earth, Wyld, Azathoth") :Helios (unit :name "Helios" :titles "The Sun") :Mene (unit :name "Mene" :titles "Selene, The Moon") :Oceanus (unit :name "Oceanus") :Prometheus (unit :name "Prometheus" :titles "The Serpent, Nyarlathotep, Phoenix") :Tartarus (unit :name "Tartarus" :titles "Oblivion") :Typhon (unit :name "Typhon" :summary "* The enemy of Zeus * A vast grisly monster with a hundred snakelike heads that extends in serpentine coils from the waist down."))))) "Mythical Beasts" (chapter :name "Mythical Beasts" :sectionmap (sectionmap "Unique Beasts" (section :name "Unique Beasts" :unitmap (unitmap :Cerberus (unit :name "Cerberus") :Charybdis (unit :name "Charybdis" :summary "* Scylla and Charybdis are two sea monsters situated on opposite sides of a narrow channel of water, so close that sailors avoiding Charybdis will pass too close to Scylla and vice versa. * She takes form as a monstrous mouth. She swallows huge amounts of water three times a day and then belches them back out again creating whirlpools.") :Scylla (unit :name "Scylla" :reference "* You consider me the young apprentice...Caught between the Scylla and Charybdis...Hypnotized by you if I should linger...Staring at the ring around your finger - The Police, Wrapped around your Finger" :summary "* Scylla and Charybdis are two sea monsters situated on opposite sides of a narrow channel of water, so close that sailors avoiding Charybdis will pass too close to Scylla and vice versa. * Scylla is a horribly grotesque sea monster, with six long necks equipped with grisly heads, each of which contained three rows of sharp teeth. Her body consisted of twelve canine legs and a fish's tail."))))) :Shapeshifters (chapter :name "Shapeshifters" :sectionmap (sectionmap :Lycanthropes (section :name "Lycanthropes" :reference "* Beauty and the Beast * The Howling * Underworld * Wolfen" :summary "* Description - A hereditary trait carried by humans and animals. * Personality - Their savagery is their greatest strength, but it threatens to consume them and leave only rage. * Some lycanthropes are more animal-like and hostile to humans. * [Vulnerability] to [Silver] * Loses control under the moon * Preferred Skills: [Lycanthropy], [Natural Weaponry] !Groups * Black Spirals - [[Corrupted]] Werewolves History * The Impergium - 8,000 years ago, humankind was becoming more organized and began systematically killing wolves or destroying their habitats. The Werewolves born from wolves decided that the humans were out of control and leading the world to chaos. They declared the open hunt (or culling) of humans called the Impergium. The Werewolves born from humans saw their own kin murdered by other Werewolves. Whatever the merits of the Impergium, it triggered a civil war between the Werewolf clans with mounting killings and atrocities. The other shapeshifters tried to stay out of the conflict but were quickly forced to take sides. The conflict only ended after the number of Shapeshifters across the world was decimated, especially those born to wolves. Since then the low birth rate of Shapeshifters has taken many races to the brink of extinction. The Impergium remains as a grim reminder of the dangers of letting ones [Rage] overcome reason. The Werewolves are embarassed by their clans' actions. The other Shapeshifters have never forgiven the Werewolves for their folly. Also, many of the Werewolves born of wolves hold deep hatred for the other Werewolves both for their betrayal and for the current state of the wolves in the world." :unitmap (unitmap :Werebat (unit :name "Werebat") :Werebear (unit :name "Werebear") :Werecat (unit :name "Werecat" :image "ModernFantasy/Lycanthrope_Weretiger.png" :reference "Every time it happens... you tell yourself it's love. But it isn't. It's blood. And death. - Cat People" :titles "Rakshasa, Werepanther, Weretiger") :Werecrow (unit :name "Werecrow" :image "ModernFantasy/Lycanthrope_Tengu.png" :summary "* Able to fly, the Werecrows make terrific scouts and spies. Their overwhelming curiousity is matched only by their tendency to gossip." :titles "Tengu, Wereraven" :unitpowermap (unitpowermap "Natural Weaponry" (unitpower :name "Natural Weaponry" :unitabilitymap (unitabilitymap "Feather Blades" (unitability :name "Feather Blades") "Feather Knives" (unitability :name "Feather Knives")))) :unitskillmap (unitskillmap :Hunting (unitskill :name "Hunting" :unitabilitymap (unitabilitymap :Scouting (unitability :name "Scouting"))))) :Wererat (unit :name "Wererat" :image "ModernFantasy/Lycanthrope_Wererat.png" :unitskillmap (unitskillmap :Stealth (unitskill :name "Stealth"))) :Werespider (unit :name "Werespider" :titles "Anasi, Arachne, Kumo" :unitpowermap (unitpowermap :Illusion (unitpower :name "Illusion" :unitabilitymap (unitabilitymap "Dazzling Beauty" (unitability :name "Dazzling Beauty") "Mirror Image" (unitability :name "Mirror Image"))) :Venomous (unitpower :name "Venomous" :unitabilitymap (unitabilitymap "Poison Bite" (unitability :name "Poison Bite") "Poison Spit" (unitability :name "Poison Spit"))))) :Werewolf (unit :name "Werewolf" :image "ModernFantasy/Lycanthrope_Werewolf.png" :reference "* The crescent moon is a double-edged sword. Be wary, lest it cut you." :titles "French/Old English: Loup-garou, Japanese: Ookami otoko"))))) "Undead Creatures" (chapter :name "Undead Creatures" :reference "* Seven Deadly Sins: Envy" :summary "* Description - The dead are normally at rest, but under certain circumstances their spirits return from the [Spirit Realm] and they rise again. Created through different means, the Undead share a common trait. Their life is artificial, a soulless parody of true life. Above all they envy the life that they lack, and they may only maintain their unlife by taking life from others. * Personality - Despite their reputation, the Undead are not innately evil. They retain at least some of their original personalities, but their new existence often forces them to reevaluate their morals. Most of the more 'ethical' Undead end their own miserable existences. * Spirit - Undead cannot recover Spirit except by stealing it from the living. Slaying the living is always worth 1 extra [Spirit] to any undead. Note: Undead are more connected to the spirit world than the living world and therefore are permanently banished from the living world if their Spirit ever drops to zero. Without a [Spirit], they many never use any [Naturalism] or [Spiritualism] magics. Types * Traumatic death - Focused completely on the trauma of their death, they are drawn to the living and end up reenacting their death with others. - Burning Dead, Drowned, Frozen Dead, Scarecrow, Wendigo. * Incomplete business - These are compelled to attempt to complete their goals. Sometimes the completion of the goal is enough to let them rest. Sometimes they continue endlessly trying to complete an impossible goal. - Shades, Poltergeists * Necromancy - Lich, Mummies, Night Terror, Skeletons, Zombies * Raised by another Undead - Ghoul, Skeleton Crew, Vampire." :titles "Restless, Restless Dead, Risen, Undeath, Unquiet" :sectionmap (sectionmap "Vampires, Elder" (section :name "Vampires, Elder" :unitmap (unitmap :Kali (unit :name "Kali" :summary "* Tzimisce Methuselah") :Set (unit :name "Set" :summary "* Setite Methuselah"))) "Vampires, Anarchs" (section :name "Vampires, Anarchs" :summary "* The strict caste system of the Camarilla does not favor new Vampires. Many newly embraced reject the machinations of the elders and live as they can on the fringe. Anarchs rely on each other to protect themselves from the actions of the Camarilla and the Sabbat. The larger organizations treat Anarchs like homeless people, largely ignoring them unless they get in their way. The Anarchs understand that the other groups are bound by rules, and they will use this to their advantage. In any situation, the Anarchs are wild cards, potentially able to shift a result one way or the other. The Anarchs have one crucial advantage over the Camarilla and Sabbat: they have nothing to lose.") "Vampires, Camarilla" (section :name "Vampires, Camarilla" :titles "Neophyte, Elder, Prince, Sheriff" :unitmap (unitmap :Brujah (unit :name "Brujah" :titles "Bully, Bruiser" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Strength (unitpower :name "Strength"))) :Gangrel (unit :name "Gangrel" :titles "Animal, Protector" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Animalism (unitpower :name "Animalism"))) :Malkavian (unit :name "Malkavian" :summary "* Cursed by Madness * Malkalv - The philosophic, antedeluvian sire of their clan. When he was destroyed with the First City. his childer began to gain the signature Madness. Some say his spirit continues through his blood and connects his childer. Others propose the preposterous notion that Malkav was a an embraced Angel. * Kinship - Unlike other tribes, the Malkavians have a natural understanding and kinship toward each other. It is rare that they outright betray one another." :titles "Jester, Maniac, Nutcase, Prankster, Psychotic" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Dominiation (unitpower :name "Dominiation") :Senses (unitpower :name "Senses") :Madness (unitpower :name "Madness")) :unitskillmap (unitskillmap :Stealth (unitskill :name "Stealth"))) :Nosferatu (unit :name "Nosferatu" :titles "Sewer Rat" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Invisibility (unitpower :name "Invisibility")) :unitskillmap (unitskillmap :Stealth (unitskill :name "Stealth"))) :Toreador (unit :name "Toreador" :reference "* We come into this stale and plain stale world. So we spend our time, searching for that one sublime revelation. To fill the void. To lose ourselves in beauty and perfection. Beauty can be elegant, seductive, full of pleasure, Raw, Violent, Lethal. Let me help us find it. To lose ourselves. Come closer. I am a beautiful way to die. - Vampire: Bloodlines 2 * She'll only come out at nights. The lean and hungry type... I wouldn't if I were you. I know what she can do. She's deadly man, she could really rip your world apart. Mind over matter. Ooh, the beauty is there but a beast is in the heart. Oh, here she comes. Watch out boy she'll chew you up. Oh, here she comes. She's a maneater. - Hall and Oates/No Hard Feelings, Maneater" :summary "* Beauty is both a blessing and a curse * Toreadors were key to founding the Camarilla and are among the most powerful and influencial clans. * The Roses in the Garden - The Toreador who are obscessed with politics, conspiring on casual walks. * Founder - It is said that the Clan's founder, Arikel was a mortal painter and/or sculptress and twin sister of Malkav in the First City. Famed throughout the lands for her work, after her Embrace she painted a mural on which the past, present and future of Kindred society was depicted. When Caine saw a terrible future for his race, he cursed her with the affliction that affects Toreador today – the art that she loved most dearly would now be her obsession and distraction above all things. * Weakness - Fascination" :titles "Artists, Clan of Roses, Degenerate, Gossips, Obsessives" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Quickness (unitpower :name "Quickness") :Senses (unitpower :name "Senses") :Presence (unitpower :name "Presence"))) :Tremere (unit :name "Tremere" :image "ModernFantasy/Vampire_Tremere.png" :summary "* The Tremere is the second youngest clan having appeared in the Dark Ages. * History - The Tremere began as House Tremere, mages of the Order of Hermes named for their leader and founder, Tremere. At the end of the first millennium, the members of House Tremere realized the Hermetic arts were failing and found its immortality potions no longer working. House Tremere undertook numerous experiments, but it was Goratrix who devised a solution in his investigation of vampires. In 1022, Goratrix invited Tremere and six of the founder's closest advisers to participate in the completed ritual, which promised true immortality. Whether Goratrix knew what would happen is known only by him and, perhaps, Tremere, but at the completion of the ritual the participants fell unconscious and were reborn as vampires, their avatars destroyed and magical abilities lost. The mages had gained their immortality but lost the power they lived for. In time, the Tzimisce made war against House Tremere in retribution for the Fiends that had been made part of Goratrix's experiments. The Order of Hermes also became suspicious of diabolical practices being performed by the increasingly secretive House. In 1037 Tremere gathered the seven newly-made Cainites and forced the blood bond upon them. He then declared to them that House Tremere would be restructured with a new pyramid hierarchy, placing himself at the top as Primus of House and clan Tremere and his seven closest followers forming the Inner Council of Seven directly under him. They would slowly begin Embracing the rest of the House, with each initiate being bound to the Inner Council to ensure their loyalty. In time, all members of House Tremere would die or become vampires. While Tremere and Etrius pursued their own research throughout Europe in converting the hermetic arts into Thaumaturgy, Goratrix once again returned to his laboratories with his apprentices at hand. After years of experimentation on captured Tzimisce, Nosferatu, and Gangrel, he succeeded in creating a Gargoyle in 1121, and by 1125 the hybrids were serving as shock troops against the Fiends. Nevertheless, the Tremere found themselves third-class citizens among the undead. Whatever boldness Tremere had shown in entering the night was ignored by the staunchly traditionalist clans, and they were often forced from cities by princes who did not look kindly on their presumption. As he and Etrius rapidly acquired more vampiric lore they discovered the history of Caine and the Antediluvians, as well as the benefits of diablerie. Seeking to establish themselves as a clan proper, the Tremere sought a clan founder to diablerize and settled on Saulot, the enigmatic founder of the Salubri clan. In 1133, Tremere and the Inner Council discovered Saulot's tomb in the Anatolian desert. Tremere diablerized the Antediluvian and promptly entered torpor, leaving the Inner Council to lead the clan and destroy the remaining Salubri. As with everything else that the Tremere had done to this point, the result was a mixed blessing. The Tremere were entrenched in many Cainite courts, their services as mages making them indispensable to princes across Europe. They were now accepted as one of the Low Clans, albeit considered usurpers, distrusted warlocks, and known diablerists. In the early years of the 21st century, the Intellegence agencies of the United States managed to gain access to SchreckNet and gained firsthand knowledge of the existence of a race of undead bloodsuckers that were spread in all corners of the world. Sharing their knowledge with other intelligence agencies, the united secret services contacted the Vatican, whom they knew to have experience fighting the undead. After years of careful research, the Second Inquisition had targeted Vienna as the 'capital of vampires' and prepared a strike against their headquarters. In 2008, a united USSOCOM and Vatican ESOG force stormed the Vienna Chantry of Clan Tremere and destroyed it, blaming it to an ISIS terror attack to the public. London, Las Vegas, Paris, and Marseilles were largely cleared of vampiric activity, with numerous captured vampires being placed in black sites and experimented upon to discover their weaknesses. The Inner Council of Seven were slain and their Blood Bonds shattered. Since then the once monolithic Tremere structure has completely fallen apart." :titles "Blood Sorcerer, Broken Clan, Pyramid, Usurpers, Warlock, Witch" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") "Blood Magic" (unitpower :name "Blood Magic"))) :Ventrue (unit :name "Ventrue" :titles "Bluebloods, Manipulator, Know-it-all" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Domination (unitpower :name "Domination") :Toughness (unitpower :name "Toughness")) :unitskillmap (unitskillmap :Influence (unitskill :name "Influence"))))) "Vampires, Sabbat" (section :name "Vampires, Sabbat" :unitmap (unitmap :Lasombra (unit :name "Lasombra" :image "ModernFantasy/Vampire_Lasombra.png" :titles "Dark Priest" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism")) :unitskillmap (unitskillmap :Influence (unitskill :name "Influence"))) :Tzimisce (unit :name "Tzimisce" :image "ModernFantasy/Vampire_Tzimisce.png" :reference "The Tzimisce take pleasure in shaping themselves into a variety of inhuman forms. Distended skulls, elongated fingers, polychromatic mottling are often displayed to demonstrate their alien superiority." :summary "* The Tzimisce's extensive use of Fleshcraft upon themselves, their servants, and their foes, have made them the most bizarre and alien of the Vampire clans. Fortunately, they are solitary by nature preferring isolated locale to practice their horrid techniques on their hapless prey. * Examples: Backroom Surgeon, Carny Folk, Dracula, Inquisitor, Kali, Mortician, Nazi Scientist, Tatoo Artist, Toturer, Vivisectionist" :titles "Monster, Alien" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Fleshcraft (unitpower :name "Fleshcraft")) :unitskillmap (unitskillmap :Intimidation (unitskill :name "Intimidation"))))) "Vampires, Independent" (section :name "Vampires, Independent" :unitmap (unitmap :Kuei-Jin (unit :name "Kuei-Jin") :Setite (unit :name "Setite" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism"))))) :Vampires (section :name "Vampires" :reference "* Dracula * I died... so many years ago. You can make me feel like it isn't so. ... I know, I should go, but I follow you like a man possessed. There's a traitor here beneath my breast, and it hurts me more than you've ever guessed. If my heart could beat, it would break my chest. But I can see, that you're unimpressed, so leave me be and let me rest in peace. Let me get some sleep. Let me take my love and bury it six feet deep. - Spike, Buff the Vampire Slayer * Cause I’ve made some real big mistakes. But you make the worst one look fine. I should’ve known it was strange. You only come out at night. I used to think I was smart. But you made me look so naïve. The way you sold me for parts. As you sunk your teeth into me, oh. Bloodsucker, dreamcrusher. Bleeding me dry like a damn vampire - Olivia Rodrigo, Vampire * Victor: I need you to understand something very, very clearly. The place we're going, if you repeat in front of them that she knows about a 'thing', she's dead. Everyone she knows is dead. Anyone she might have texted is dead. So you're going to have to learn from this exact second, how to keep a secret. There's a little show we have to put on. You might call it a sort of masquerade that we all have to live into, that none of this is real. Never in your life did you think this is real, and is has been the entire time. So learn to lie to your girlfriend if you want to live. Nelli G: Or if you want to live. Jasper: That too. - L.A By Night * Annabelle: You seem reasonable. Why do you follow their orders?... Jasper: I follow his orders because if I don't, I get left in that sun that hurts so much... I work with them because if I don't, I get introduced to the dawn. I do a lot of things, so I get to keep living... It's a game we all play, so we get to keep doing this. Talking, living, walking. - L.A By Night" :summary "* Description - Among most powerful and feared of all undead, Vampires are among the oldest known undead creatures with legends that go back to the first intelligent humans. They possess the abilities that they had in life as well as gaining unique vampiric powers. * Feeding - Vampires regain Spirit only by drinking the blood of the living. Some Eastern Vampires eat the flesh of the living instead. As the Spirit of a Vampire decreases, the Vampire becomes more savage and beastial. * Morale - Normal, Low vs. Fire and Sunlight. Ironically, the one thing that truly terrifies these eternal, murderous beings is the end of their own cursed lives. * Vulnerability to Fire - The cleansing touch of Fire will rapidly consume a Vampire. * Vulnerability to Sunlight - The cleansing touch of Sunlight will ignite a Vampire on Fire. During daylight hours, Vampires fall into a deathlike sleep. Contrary to some sources, arificial sunlight has no effect on them. * Vulnerability to Silver - The cleansing touch of Silver will ignite a Vampire on Fire. Even their reflection is destroyed by Silver. Contrary to some sources, non-silver mirrors still reflect the image of a Vampire. * Immunity to Bleeding - Vampire blood can move on its own and will not leave the body without force. * Biology - Vampires are created when one Vampire drains a person to the brink of death and then feeds their own blood to the victim. This is called: The Embrace. At this moment, the victim has a chance to reject the Embrace, and die peacefully. If the victim accepts the Embrace, the blood will rapidly reach the victim's heart and the transformation to Vampire will immediately begin. * Nature - There is much conjecture about how a Vampire functions, but it is certain that the blood of a Vampire is the source of its unnatural existence. Some believe that the blood itself is a form of evil, magical, parasite centered on the heart that animates the Vampire's body. * Masquerade - During the day, Vampires are completely vulnerable. Therefore, they avoid drawing attention to themselves. They pretend to be normal people while manipulating from behind the scenes. Vampires appear as near perfect humans, but this too is a mask. Vampires pretend at being sophisticated and refined, but always behind this is their true, savage, bestial nature. * Sire - The vampire's creator. * Childer - The relationship of a vampire to a Sire. * Book of Nod - The vampiric history/bible. * Antitribu - Those who choose to oppose their clan, joining the Camarilla or Sabbat respectively." :titles "Cainite, Kindred, Leech, Lick" :sectionmap (sectionmap "Vampires, Elder" (section :name "Vampires, Elder" :unitmap (unitmap :Kali (unit :name "Kali" :summary "* Tzimisce Methuselah") :Set (unit :name "Set" :summary "* Setite Methuselah"))) "Vampires, Anarchs" (section :name "Vampires, Anarchs" :summary "* The strict caste system of the Camarilla does not favor new Vampires. Many newly embraced reject the machinations of the elders and live as they can on the fringe. Anarchs rely on each other to protect themselves from the actions of the Camarilla and the Sabbat. The larger organizations treat Anarchs like homeless people, largely ignoring them unless they get in their way. The Anarchs understand that the other groups are bound by rules, and they will use this to their advantage. In any situation, the Anarchs are wild cards, potentially able to shift a result one way or the other. The Anarchs have one crucial advantage over the Camarilla and Sabbat: they have nothing to lose.") "Vampires, Camarilla" (section :name "Vampires, Camarilla" :titles "Neophyte, Elder, Prince, Sheriff" :unitmap (unitmap :Brujah (unit :name "Brujah" :titles "Bully, Bruiser" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Strength (unitpower :name "Strength"))) :Gangrel (unit :name "Gangrel" :titles "Animal, Protector" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Animalism (unitpower :name "Animalism"))) :Malkavian (unit :name "Malkavian" :summary "* Cursed by Madness * Malkalv - The philosophic, antedeluvian sire of their clan. When he was destroyed with the First City. his childer began to gain the signature Madness. Some say his spirit continues through his blood and connects his childer. Others propose the preposterous notion that Malkav was a an embraced Angel. * Kinship - Unlike other tribes, the Malkavians have a natural understanding and kinship toward each other. It is rare that they outright betray one another." :titles "Jester, Maniac, Nutcase, Prankster, Psychotic" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Dominiation (unitpower :name "Dominiation") :Senses (unitpower :name "Senses") :Madness (unitpower :name "Madness")) :unitskillmap (unitskillmap :Stealth (unitskill :name "Stealth"))) :Nosferatu (unit :name "Nosferatu" :titles "Sewer Rat" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Invisibility (unitpower :name "Invisibility")) :unitskillmap (unitskillmap :Stealth (unitskill :name "Stealth"))) :Toreador (unit :name "Toreador" :reference "* We come into this stale and plain stale world. So we spend our time, searching for that one sublime revelation. To fill the void. To lose ourselves in beauty and perfection. Beauty can be elegant, seductive, full of pleasure, Raw, Violent, Lethal. Let me help us find it. To lose ourselves. Come closer. I am a beautiful way to die. - Vampire: Bloodlines 2 * She'll only come out at nights. The lean and hungry type... I wouldn't if I were you. I know what she can do. She's deadly man, she could really rip your world apart. Mind over matter. Ooh, the beauty is there but a beast is in the heart. Oh, here she comes. Watch out boy she'll chew you up. Oh, here she comes. She's a maneater. - Hall and Oates/No Hard Feelings, Maneater" :summary "* Beauty is both a blessing and a curse * Toreadors were key to founding the Camarilla and are among the most powerful and influencial clans. * The Roses in the Garden - The Toreador who are obscessed with politics, conspiring on casual walks. * Founder - It is said that the Clan's founder, Arikel was a mortal painter and/or sculptress and twin sister of Malkav in the First City. Famed throughout the lands for her work, after her Embrace she painted a mural on which the past, present and future of Kindred society was depicted. When Caine saw a terrible future for his race, he cursed her with the affliction that affects Toreador today – the art that she loved most dearly would now be her obsession and distraction above all things. * Weakness - Fascination" :titles "Artists, Clan of Roses, Degenerate, Gossips, Obsessives" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Quickness (unitpower :name "Quickness") :Senses (unitpower :name "Senses") :Presence (unitpower :name "Presence"))) :Tremere (unit :name "Tremere" :image "ModernFantasy/Vampire_Tremere.png" :summary "* The Tremere is the second youngest clan having appeared in the Dark Ages. * History - The Tremere began as House Tremere, mages of the Order of Hermes named for their leader and founder, Tremere. At the end of the first millennium, the members of House Tremere realized the Hermetic arts were failing and found its immortality potions no longer working. House Tremere undertook numerous experiments, but it was Goratrix who devised a solution in his investigation of vampires. In 1022, Goratrix invited Tremere and six of the founder's closest advisers to participate in the completed ritual, which promised true immortality. Whether Goratrix knew what would happen is known only by him and, perhaps, Tremere, but at the completion of the ritual the participants fell unconscious and were reborn as vampires, their avatars destroyed and magical abilities lost. The mages had gained their immortality but lost the power they lived for. In time, the Tzimisce made war against House Tremere in retribution for the Fiends that had been made part of Goratrix's experiments. The Order of Hermes also became suspicious of diabolical practices being performed by the increasingly secretive House. In 1037 Tremere gathered the seven newly-made Cainites and forced the blood bond upon them. He then declared to them that House Tremere would be restructured with a new pyramid hierarchy, placing himself at the top as Primus of House and clan Tremere and his seven closest followers forming the Inner Council of Seven directly under him. They would slowly begin Embracing the rest of the House, with each initiate being bound to the Inner Council to ensure their loyalty. In time, all members of House Tremere would die or become vampires. While Tremere and Etrius pursued their own research throughout Europe in converting the hermetic arts into Thaumaturgy, Goratrix once again returned to his laboratories with his apprentices at hand. After years of experimentation on captured Tzimisce, Nosferatu, and Gangrel, he succeeded in creating a Gargoyle in 1121, and by 1125 the hybrids were serving as shock troops against the Fiends. Nevertheless, the Tremere found themselves third-class citizens among the undead. Whatever boldness Tremere had shown in entering the night was ignored by the staunchly traditionalist clans, and they were often forced from cities by princes who did not look kindly on their presumption. As he and Etrius rapidly acquired more vampiric lore they discovered the history of Caine and the Antediluvians, as well as the benefits of diablerie. Seeking to establish themselves as a clan proper, the Tremere sought a clan founder to diablerize and settled on Saulot, the enigmatic founder of the Salubri clan. In 1133, Tremere and the Inner Council discovered Saulot's tomb in the Anatolian desert. Tremere diablerized the Antediluvian and promptly entered torpor, leaving the Inner Council to lead the clan and destroy the remaining Salubri. As with everything else that the Tremere had done to this point, the result was a mixed blessing. The Tremere were entrenched in many Cainite courts, their services as mages making them indispensable to princes across Europe. They were now accepted as one of the Low Clans, albeit considered usurpers, distrusted warlocks, and known diablerists. In the early years of the 21st century, the Intellegence agencies of the United States managed to gain access to SchreckNet and gained firsthand knowledge of the existence of a race of undead bloodsuckers that were spread in all corners of the world. Sharing their knowledge with other intelligence agencies, the united secret services contacted the Vatican, whom they knew to have experience fighting the undead. After years of careful research, the Second Inquisition had targeted Vienna as the 'capital of vampires' and prepared a strike against their headquarters. In 2008, a united USSOCOM and Vatican ESOG force stormed the Vienna Chantry of Clan Tremere and destroyed it, blaming it to an ISIS terror attack to the public. London, Las Vegas, Paris, and Marseilles were largely cleared of vampiric activity, with numerous captured vampires being placed in black sites and experimented upon to discover their weaknesses. The Inner Council of Seven were slain and their Blood Bonds shattered. Since then the once monolithic Tremere structure has completely fallen apart." :titles "Blood Sorcerer, Broken Clan, Pyramid, Usurpers, Warlock, Witch" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") "Blood Magic" (unitpower :name "Blood Magic"))) :Ventrue (unit :name "Ventrue" :titles "Bluebloods, Manipulator, Know-it-all" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Domination (unitpower :name "Domination") :Toughness (unitpower :name "Toughness")) :unitskillmap (unitskillmap :Influence (unitskill :name "Influence"))))) "Vampires, Sabbat" (section :name "Vampires, Sabbat" :unitmap (unitmap :Lasombra (unit :name "Lasombra" :image "ModernFantasy/Vampire_Lasombra.png" :titles "Dark Priest" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism")) :unitskillmap (unitskillmap :Influence (unitskill :name "Influence"))) :Tzimisce (unit :name "Tzimisce" :image "ModernFantasy/Vampire_Tzimisce.png" :reference "The Tzimisce take pleasure in shaping themselves into a variety of inhuman forms. Distended skulls, elongated fingers, polychromatic mottling are often displayed to demonstrate their alien superiority." :summary "* The Tzimisce's extensive use of Fleshcraft upon themselves, their servants, and their foes, have made them the most bizarre and alien of the Vampire clans. Fortunately, they are solitary by nature preferring isolated locale to practice their horrid techniques on their hapless prey. * Examples: Backroom Surgeon, Carny Folk, Dracula, Inquisitor, Kali, Mortician, Nazi Scientist, Tatoo Artist, Toturer, Vivisectionist" :titles "Monster, Alien" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Fleshcraft (unitpower :name "Fleshcraft")) :unitskillmap (unitskillmap :Intimidation (unitskill :name "Intimidation"))))) "Vampires, Independent" (section :name "Vampires, Independent" :unitmap (unitmap :Kuei-Jin (unit :name "Kuei-Jin") :Setite (unit :name "Setite" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism"))))))))))))
nx/tactics/books/bestiary / tacticsbook
Description:
Function Name:
  • tacticsbook
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func tacticsbook : base/book (book :name "Bestiary" :image "FloraAndFauna.jpg" :chaptermap (chaptermap "Bestiary Overview" (chapter :name "Bestiary Overview" :sectionmap (sectionmap "Why Tactics: Bestiary?" (section :name "Why Tactics: Bestiary?"))) :Amphibians (chapter :name "Amphibians" :sectionmap (sectionmap "Fantastic Amphibians" (section :name "Fantastic Amphibians" :unitmap (unitmap "Frog, Giant" (unit :name "Frog, Giant") "Toad, Giant" (unit :name "Toad, Giant") "Toad, Giant Poisonous" (unit :name "Toad, Giant Poisonous"))))) :Arthropods (chapter :name "Arthropods" :sectionmap (sectionmap "Fantastic Arthropods" (section :name "Fantastic Arthropods" :unitmap (unitmap "Ant, Giant" (unit :name "Ant, Giant") "Ant, Huge" (unit :name "Ant, Huge") "Ant, Huge Fire" (unit :name "Ant, Huge Fire") "Ant Lion, Giant" (unit :name "Ant Lion, Giant") "Ant Lion, Huge" (unit :name "Ant Lion, Huge") "Beetle, Giant" (unit :name "Beetle, Giant") "Beetle, Giant Pincher" (unit :name "Beetle, Giant Pincher") "Beetle, Giant Rinoceros" (unit :name "Beetle, Giant Rinoceros") "Beetle, Hugh" (unit :name "Beetle, Hugh") "Beetle, Hugh Fire" (unit :name "Beetle, Hugh Fire") "Caterpillar, Giant" (unit :name "Caterpillar, Giant") "Centipede, Giant" (unit :name "Centipede, Giant") "Centipede, Hugh Poisonous" (unit :name "Centipede, Hugh Poisonous") "Cockroach, Giant" (unit :name "Cockroach, Giant") "Dragonfly, Giant" (unit :name "Dragonfly, Giant") "Dragonfly, Huge" (unit :name "Dragonfly, Huge") "Fire Bug" (unit :name "Fire Bug") "Firefly, Huge" (unit :name "Firefly, Huge") "Lightning Bug, Huge" (unit :name "Lightning Bug, Huge") "Mantis, Giant" (unit :name "Mantis, Giant") "Mantis, Huge" (unit :name "Mantis, Huge") "Mosquito, Giant" (unit :name "Mosquito, Giant") "Mosquito, Huge" (unit :name "Mosquito, Huge") "Scarab, Huge" (unit :name "Scarab, Huge") "Scorpion, Giant" (unit :name "Scorpion, Giant") "Scorpion, Huge" (unit :name "Scorpion, Huge") "Spider, Giant" (unit :name "Spider, Giant") "Spider, Huge" (unit :name "Spider, Huge") "Spider, Huge Spitting" (unit :name "Spider, Huge Spitting") "Spider, Huge Trap Door" (unit :name "Spider, Huge Trap Door") "Spider, Huge Water" (unit :name "Spider, Huge Water") "Spider, Phase" (unit :name "Spider, Phase" :titles "Dimension Spider") :Vasp (unit :name "Vasp" :summary "* The Vasp is a giant predatory insectoid. They stand 10 feet tall with segmented bodies covered with metallic scales. Despite their size and ungainly appearance, they are surprisingly quick and can leap 30 feet. * Vasps are solitary nocturnal creatures that usually attack by leaping on its victim, pining it to the ground, and stinging it to death with its tail. Its stinger exudes a caustic venom that slowly dissolves the internal organs. While the toxin is taking effect, the Vasp wraps it prey in a silky cocoon and drags it back to its lair." :mass "250kg" :height "3m") "Wasp, Huge" (unit :name "Wasp, Huge") "Wasp, Parasite" (unit :name "Wasp, Parasite") "Worm, Giant" (unit :name "Worm, Giant") "Worm, Giant Sand" (unit :name "Worm, Giant Sand"))))) :Avians (chapter :name "Avians" :sectionmap (sectionmap "Fantastic Avians" (section :name "Fantastic Avians" :unitmap (unitmap :Hekler (unit :name "Hekler" :summary "* The Hekler is a pestiferous variety of bird identified by its spiked plummage and awful, shrill cry they produce when hungry. Heklers have the annoying habit of following travellers scrounging for handouts and leftovers. They are extremely persistent and will pursue their victims for miles, swawking incessently. Worse, the call is audible for two miles and is known to attract predatory beasts. If fed, they become silent while they eat, providing an opportunity to escape." :titles "Nag-Bird") "Iron Shrike" (unit :name "Iron Shrike" :summary "* A long beaked bird with metallic plumage. Their metallic feathers make them very hardy but also poor flyers. They hunt by diving at full speed from high altitudes and impaling their prey on their dagger-like beaks.") "Sky Jelly" (unit :name "Sky Jelly") "Sky Pufferfish" (unit :name "Sky Pufferfish") "Sky Shark" (unit :name "Sky Shark") "Sky Squid" (unit :name "Sky Squid") :Skyfish (unit :name "Skyfish" :summary "* Skyfish have developed their flotation bladders to hold lighter than air gases. Their bodies and bones are porous and very lightweight, so they are somewhat more vulnerable to impact damage. If their flotation bladder is ruptured, they will sink. Some skyfish have adapted to live at very high altitudes to avoid predators.") "Winged Viper" (unit :name "Winged Viper" :summary "* A snake with feathered wings and a mildly poisonous bite. They are generally small but can grow to 10 feet. They feed on small creatures, but will attack larger targets when hungry or disturbed."))))) :Mammals/Marsupials (chapter :name "Mammals/Marsupials" :sectionmap (sectionmap "Fantastic Mammals" (section :name "Fantastic Mammals" :unitmap (unitmap "Bat, Huge" (unit :name "Bat, Huge") "Boar, Great" (unit :name "Boar, Great") "Ferret, Keen" (unit :name "Ferret, Keen" :summary "* These furred scavengers are hoarders and theives by nature robbing nests and homes alike. They have uncanny manual dexterity and are natural thieves able to squeeze into tight places, evade detection, and untie knots. * If caputured at infancy, they can be raised as pets and taught to steal for its master. For this reason, they are valuable to professional thieves. * With training they can be taught to pick pockets and even pick simple locks." :mass "2kg" :length ".5m") "Rat, Bog" (unit :name "Rat, Bog") "Rat, Crypt" (unit :name "Rat, Crypt") "Rat, Plague" (unit :name "Rat, Plague") :Terrorphant (unit :name "Terrorphant" :summary "* A giant, carnivorous elephant. An evily, intelligent alpha predator.") :Terrorpotmus (unit :name "Terrorpotmus" :summary "* A giant, carnivorous hippopotamus. An keenly intelligent alpha predator.") "Wolf, Dire" (unit :name "Wolf, Dire") "Wolf, Warg" (unit :name "Wolf, Warg") "Wolverine, Huge" (unit :name "Wolverine, Huge"))))) "Marine Creatures" (chapter :name "Marine Creatures" :sectionmap (sectionmap "Fantastic Marine Creatures" (section :name "Fantastic Marine Creatures" :unitmap (unitmap "Crab, Giant" (unit :name "Crab, Giant") "Maray Eel, Giant" (unit :name "Maray Eel, Giant" :summary "* Giant, sightless eels native to deep undersea caves and grottos. These aggressive predators measure over 20 feet and have rows of sharp jagged teeth." :titles "Kra") "Kingfisher, Giant" (unit :name "Kingfisher, Giant") "Lamprey, Huge" (unit :name "Lamprey, Huge") "Octopus, Giant" (unit :name "Octopus, Giant") "Red Tide" (unit :name "Red Tide") "Sea Serpent" (unit :name "Sea Serpent") "Seahorse, Huge" (unit :name "Seahorse, Huge") "Shark, Megalodon" (unit :name "Shark, Megalodon"))))) :Reptiles (chapter :name "Reptiles" :sectionmap (sectionmap "Fantastic Reptiles" (section :name "Fantastic Reptiles" :unitmap (unitmap :Balizard (unit :name "Balizard" :summary "* A large, magical variety of lizard that survives in arctic climates. Its body temperature matches the surrounding. It has a special form of gaze ability where it can draw heat from any target it is facing into its nose and mouth. It uses this ability to freeze opponents before eating their icy remains.") "Crocodile, Giant" (unit :name "Crocodile, Giant") "Desert Strider" (unit :name "Desert Strider" :summary "* Striders are large bipedal desert creatures resembling a cross between a lizard and a flightless bird. Striders are perfectly acclimated to desert life. They can go for months without water, have protective lenses over their eyes, and actually process sunlight to supplement the insects and reptiles they normally consume. Conversely, they cannot survive outside a desert environment.") "Lizard, Giant" (unit :name "Lizard, Giant") "Serpent, Great" (unit :name "Serpent, Great") "Snake, Crypt Cobra" (unit :name "Snake, Crypt Cobra") "Snake, Swaying Cobra" (unit :name "Snake, Swaying Cobra" :summary "* This seemingly normal Cobra has the enhanced ability to hypnotise its victim. * Hypnotism - By slowly swaying back and forth and removing all hostile intent from its mind, the Cobra creates the illusion that it is peaceful and harmless. Its victim becomes enthralled and simply watches as the Cobra slowly advances. When the Cobra is face to face with its victim, it attacks with lightning speed to bite the face or throat to deposit its venom near the victim's brain." :titles "Hypnotic Cobra") "Tortoise, Giant" (unit :name "Tortoise, Giant"))))) :Plants (chapter :name "Plants" :sectionmap (sectionmap "Fantastic Plants" (section :name "Fantastic Plants" :itemmap (itemmap "Black Lotus" (item :name "Black Lotus" :image "Fantasy/BlackLotus.jpg" :reference "* Blue Lotus - Recent studies have shown Nymphaea caerulea to have psychedelic properties, and may have been used as a sacrament in ancient Egypt and certain ancient South American cultures. Dosages of 5 to 10 grams of the flowers induces slight stimulation, a shift in thought processes, enhanced visual perception, and mild closed-eye visuals." :summary "* Black Lotus is a medium sized blue/black flower that has strong hallucinogenic and magical properties. Eating the petals of the Lotus creates pleasant hallucinations that are strongly addictive over time. The greatest danger of eating lotus petals is that the potency grows from mild euphoria at the tip of the petal to intense hallucinations, madness, and death near the flower. The trick is to only eat the amount that will give you the effect you desire, but the flower is hard to get and the temptation is strong to go back for more. The desperately addicted Lotus-Eaters eventually use too much and go mad or die. * Black Lotus grows only in deep swamps such as those near the city of [Fiaqua] (the Flower on the Water) and must be cultivated to gain its full potential. The Lotus retains its potency for about a month after picking, but the petals wither shortly after being removed, so the flower is typically kept intact despite the dangers.") "Black Rose" (item :name "Black Rose" :reference "* The Black Rose blooms once more! - LeBlanc, Runeterra * Another rose for the garden. - LeBlanc, Runeterra" :summary "* Black roses have often been associated with mystery, hatred, death, dishonor, tragic romance, and the supernatural in different cultures and traditions. In literature and art, they frequently symbolize tragic love or the darker aspects of human emotions. Despite their associations with darkness, black roses can also convey elegance, sophistication, and rebirth in some contexts. This dual symbolism has contributed to their enduring allure and cultural significance." :titles "Rosa Black Baccara") :Devilroot (item :name "Devilroot" :summary "* A rare species of plant recognizable by its forked leaves and crimson forked root. The powdered root is a deadly poison.") :K'Tallah (item :name "K'Tallah" :summary "* A rare swamp plant with gray-green leaves. It is also a highly addictive euphoric that can provide visions of the near future. After a half dozen uses, the user becomes hopelessly addicted and must consume a leaf each day or suffer horrible and ultimately fatal consequences. The first symptoms are stomach pains and the uneasy feeling that some is growing within. Next the snakelike tentrils of new K'Tallah plants sprout from the eyes, ears, and mouth. Death follows quickly. Heavy users, arguably the most wretched folk in existence, claim that leaves plucked from the body of a deceased addict are especially savory.") :Mandrake (item :name "Mandrake" :summary "* A long leaved (nearly a foot long) dark green plant with small greenish-yellow or purple bell-shaped flowers that grow on 3-4 inch stalks. It is best known for the large brown root, running 3 to 4 feet into the ground sometimes single and sometimes forked into two or three distinctive branches which gives the plant a rough resemblance to that of a human monster form. * It was supposed to grow under the feet of a hanged man where his semen dripped on to the earth; this would appear to be the reason for the methods employed by the alchemists who 'projected human seed into animal earth'. It could only be pulled from the ground after performing the necessary rituals. It was advisable to put wax in the ears before one attempted to do this: the mandrake would scream when pulled free and this could cause deafness. * A whole Mandrake root placed in the home, will give the house protection, fertility, and prosperity. Also, where there is Mandrake, demons cannot abide. Money placed beside the root is said to multiply. It was also recommended for discovering treasures, and as an ingredient for charm for pregnancy.") :Morphious (item :name "Morphious" :summary "* A parasitic plant that grows amidst the branches of trees and bushes. The frangrance it produces causes intoxication, drowsiness, and sleep. Those who fall asleep under Morphious will not awake while they can smell the lovely Morphious. Eventually, they die and decompose feeding the plants that the Morphious preys upon. Morpious can be distilled into even more potent intoxicants, sleeping potions and powers." :titles "Euphorica, Mantrap") :Skullcap (item :name "Skullcap" :summary "* A powerful hallucinogenic mushroom with a bone-white cap. It is said to be the cause of the Wildmen's irrational behavior. * Ingesting small amounts cause highly irrational and often violent behavior. Consuming a full dram is usually fatal in minutes.") "Snow Lily" (item :name "Snow Lily" :summary "* A delicate white flower that grows only in the coldest climates. * Consuming it delays the onset of frostbite. Brewed into an elixir, it allows the consumer's body temperature to fall to below freezing with no ill effects.") :Stranglevine (item :name "Stranglevine") :Stenchroot (item :name "Stenchroot" :summary "* A tuber with horribly, noxious smelling sap. When gathered into clay pots, the Stenchroot sap can make nausea inducing grenades.") :Tantalus (item :name "Tantalus" :summary "* A small leafy plant wih a tuberous, heart-shaped root. A powder formed from the dried root can make a powerful aphrodisiac.")) :unitmap (unitmap :Arborian (unit :name "Arborian" :titles "Treefolk, Verdure") :Creep (unit :name "Creep" :summary "* The Creep is a vine growth that lives in [Jungle] Terrain that is not hostile per se, but it's aggressive growth can surround, entrap, and immobilize even giant creatures over time. It often lives in symbiosis with opportunist predators. Fortunately, the Creep only grows during the day.") "Creeping Mold" (unit :name "Creeping Mold" :reference "* I'm a goner already, Daddy. Ain't I? I've got that stuff out of the meteor on me... and I'm gone. Ain't I? - Jordy, Creepshow") :Deadwood (unit :name "Deadwood" :summary "* A corrupted spirit that resembles a twisted humanoid composed of dead decaying wood. Deadwood is created when a woodland area is exposed to powerful corruption. Once established in an area, it begins to absorb life energies from all living creatures around it. All vegetation around will become warped and withered. Living creatures will fall sick developing strange ailments. Meanwhile, the Deadwood grows in power. * Deadwood can control plant life and unliving wood. They cannot be destroyed except by enchanted weapons, fire, or by starving it by destroying the surrounding plant life." :titles "Plant Demon, Wood Grue") "Giant Fisher Plant" (unit :name "Giant Fisher Plant" :summary "* A huge creeper vine plant that covers mulitple nearby trees and has enormous blossoms hanging from high branches. The plant attacks living creatures by dropping vines from the bottom of the blossums that entwine and drag prey into the canaopy above where they die of strangulation or dehydration and are eventually digested. Bones and bits of carcass are dropped below to lure more prey.") :Shambler (unit :name "Shambler" :summary "* An animated pile of decaying vegetation.") :Slime (unit :name "Slime") "Strangle Vine" (unit :name "Strangle Vine" :summary "* A large, creeper vine that waits attacks like a constrictor snake. They typically hang in jungles or caves and strike from above or slowly entwine immobile (e.g. sleeping) targets on the ground.") :Triffid (unit :name "Triffid") "Venus Flytrap, Giant" (unit :name "Venus Flytrap, Giant"))))) :Microorganisms (chapter :name "Microorganisms" :sectionmap (sectionmap "Fantastic Diseases" (section :name "Fantastic Diseases" :itemmap (itemmap "Corpse Rot" (item :name "Corpse Rot" :summary "* Disease transmitted by the bite of Ghouls/Necrophages. Symptoms include fever, severe weakness, unconsciousness, and a gradual blackening and swelling of the limbs starting at the site of the wound and spreading across the body. The disease only affects humans") "Swamp Fever" (item :name "Swamp Fever" :summary "* A water-borne disease appearing only in hot weather. It causes irrational behavior, constant thirsting and a tendency to lean to one side while walking or standing. The irrational behavior gradually becomes permanent raving madness.") :Yakuk (item :name "Yakuk" :summary "* A disease common in jungle regions, it causes the gradual loss of sight, hearing, smell, taste, and speech, one at a time over a 2 week period. The effect becomes permanent but is not fatal, though the sensory deprivation usually ends in madness.") "Yellow Tinge" (item :name "Yellow Tinge" :summary "* An infectious disease that affects water breathers. The victim's gills slowly become clogged with a sticky, yellow secretion that interferes with breathing can kill if not treated."))))) "Underground Creatures" (chapter :name "Underground Creatures" :sectionmap (sectionmap "Fantastic Underground Creatures" (section :name "Fantastic Underground Creatures" :unitmap (unitmap "Bore Worms" (unit :name "Bore Worms" :reference "* Bring me... the Bore Worms. No! Not the BORE WORMS! - Klytus and Princess Aura, Flash Gordon" :summary "* Small worms that dig through flesh as easily as earth. They are attracted to burrowing creatures.") "False Hydra" (unit :name "False Hydra" :summary "* An insane monster that grows under towns can erase memories. It is said that it is born of lies. Perhaps it is a [Curse].") "Land Eel, Giant" (unit :name "Land Eel, Giant" :summary "* Giant, sightless creatures related to the Giant Moray Eel, these creatures burrow underground." :titles "Land Kra") "Slug, Giant" (unit :name "Slug, Giant") "Snail, Giant" (unit :name "Snail, Giant") "Sand Worms" (unit :name "Sand Worms"))))) :Humanoids (chapter :name "Humanoids" :sectionmap (sectionmap :Humans (section :name "Humans" :unitmap (unitmap "Human Female" (unit :name "Human Female" :summary "* Their extra [Mind] represents their extra need to work the system instead of using force. * Their extra [Will] represents their ability to endure hardship without breaking." :mind "6:1" :will "6:1" :mass "60kg") "Human Male" (unit :name "Human Male" :mind "5:1" :will "5:1" :mass "80kg"))))) "Humanoids, Fantastic" (chapter :name "Humanoids, Fantastic" :summary "This book subscribes to a more nuanced version of humanoid creatures than the classic Elves and Dwarves: * Like Great Danes and Poodles are just dogs that have rapidly changed in the face of selective breeding, these beings are still human. * They have minor differences in abilities, but these are cultural. * In this book, their physical and cultural differences are meant to be analogies for modern cultural differences and intolerance. * Languages: ** Each nation has its own language. Most travellers learn many languages in addition to tradespeak. ** Tradespeak - Merchants have created this simple language to facilitate trade. It is a very limited language, but can be used for basic communication if there is no alternative. It uses a simple format with no plurals, conjegation or tense: {Adjective(s)} {Subject Noun} {Adverb(s)} {Verb} {Adjective(s)} {Object Noun}. Examples: Trustworthy me offer 10 healthy sheep. Honorable you please each pay 20 silver. ** Thieves' Cant - A variant on Tradespeak that emphasizes secret or silent communication to mask criminal activity." :sectionmap (sectionmap :Seraphim (section :name "Seraphim" :summary "* Aerie" :titles "Zephyr"))) :Beastmen (chapter :name "Beastmen" :sectionmap (sectionmap :Wildman (section :name "Wildman" :reference "Chewbacca" :summary "* The wildmen are close relatives to normal humans but have distinctly animalistic qualities including fur and fangs." :unitmap (unitmap "Jaka Manhunter" (unit :name "Jaka Manhunter" :summary "* The Jaka are a race of intelligent man-like beings with features resembling a cross between man, wolf, and panther. They are a striking people with sleek black fur and yellow/green eyes. * Personality - The Jaka are solitary beings, sullen and introspective in nature. They have been known to become steadfast companions to those they trust, but have also been known to become cold-blooded killers to those who cross them. * Lifestyle - They are cunning and have excellent senses, so they make are superb hunters. They typically live off the land but also trade their extra hides and animal parts for useful gear. Some have extended their tracking and hunting skills to become bounty hunters: tracking and capturing fugitives from justice and living off the bounty."))))) :Constructs (chapter :name "Constructs" :sectionmap (sectionmap :Phantasms (section :name "Phantasms" :summary "* Phantasms are created through powerful [Illusion]." :unitmap (unitmap "Phantasmal Force" (unit :name "Phantasmal Force") "Phantasmal Mount" (unit :name "Phantasmal Mount") "Phantasmal Monster" (unit :name "Phantasmal Monster") "Phantasm Warrior" (unit :name "Phantasm Warrior"))))) :Dragons (chapter :name "Dragons" :summary "* Morale - Normal * Units - Individuals * Dragons are ancient beings and remember the time, before men, when their kind ruled the world." :sectionmap (sectionmap "Monstrous Dragons" (section :name "Monstrous Dragons" :unitmap (unitmap :Apophis (unit :name "Apophis" :reference "Egyptian Mythology") :Ladon (unit :name "Ladon") "Midgard Serpent" (unit :name "Midgard Serpent" :reference "Norse Mythology") :Pytho (unit :name "Pytho") :Stoorworm (unit :name "Stoorworm") :Tiamat (unit :name "Tiamat" :reference "Babylonian Mythology" :titles "Avatar of Chaos, Avatar of the Wyrm, The Beast, Mother of All Life"))))) :Elementals (chapter :name "Elementals" :summary "* All summoned Elementals are tied to their summoning point. If at any time, the elemental cannot trace a continuous line through their element to the summoning point, they are immediately banished back to their home plane. This is easiest for Air and Earth Elementals and hardest for Water and Fire Elementals. The most straightforward way to leverage this weakness is to isolate the summoning point using a different element." :sectionmap (sectionmap "Water Elementals" (section :name "Water Elementals" :unitmap (unitmap "Hydro Essence" (unit :name "Hydro Essence" :summary "* A mindless, condensed blob of Hydro energy. * Since slimes store magical energy they are highly sought after by mages and alchemists." :titles "Hydro Slime, Hydrolon, Water Slime") :Naiad (unit :name "Naiad" :titles "Nereid, Nyad") :Undine (unit :name "Undine") "Water Elemental" (unit :name "Water Elemental") "Water Elemental Lord" (unit :name "Water Elemental Lord" :summary "* Greater Water Elementals are enormous creatures that can appear as a lake, a whirlpool, or a tidal wave. They have complete mastery over the Water, can perform any Water Power at maximum ability and can cancel any other being attempting to use Fire." :unitpowermap (unitpowermap :Water (unitpower :name "Water" :level "20"))) "Water Sprite" (unit :name "Water Sprite"))))) :Extra-Dimensional (chapter :name "Extra-Dimensional" :sectionmap (sectionmap :Mirrorlands (section :name "Mirrorlands" :unitmap (unitmap "Mirror Reflection" (unit :name "Mirror Reflection" :summary "* A Mirror Reflection is being from the Mirrorlands that has no personal definition but longs for the definition of others. To this end, they become a mirror image of another being and try to impersonate the person though they lack any memories of the original. It would be practical to dispose of the original, but they are always only a reflection so they would die as well.") "Mirror Shard" (unit :name "Mirror Shard" :summary "* A Mirror Shard is a weaker form of a [Mirror Reflection]. It copies some single aspect of the original but is otherwise an empty shell. This incompleteness drives them mad with desperation. They are always drawn to the those they copy and are usually irrationally destructive. * [Action] [Target]: The Mirror Shard becomes the same [Mass] as the target. Then choose one [Skill] or [Power] to copy. The Mirror Shard gains that Skill/Power and loses all other Skills and Powers. It [Body], [Mind], and [Will] are altered accordingly."))))) :Darkling (chapter :name "Darkling" :titles "Goblinoid" :sectionmap (sectionmap :Uruks (section :name "Uruks" :reference "* Cro-magnon Man, Goths, Huns, Mongols, Vandals * Seven Deadly Sins: Wrath" :summary "* Description - Uruks are a relatively primitive species of barrel-chested humanoids distantly related to Humans. They are sturdy and imposing figures, trained by hard labor and warfare since birth. They range in height from 5 feet to 7 feet tall and typically have yellowish/grey/green skin, red/black/brown eyes, and long black/grey/white hair. Their noses are flat and they have a notably large mouth with uneven teeth. * Personality - Uruks are typically violent, impatient, and crude. They take what they want by force and are difficult to bargain with. Their culture and leaders claim that they are destined to take over the world and take back all that has been taken from them. Now they are consumed with wrath and envy of the achievements of other races and other orc tribes. * Culture - Their civilization is still in a hunter/gatherer stage. They lack the patience and desire to read, cultivate crops, domesticate herd animals, or invent sophisticated equipment. They live a semi-nomadic existence depending on the availability of resources and the charisma of their leaders. Uruk 'kingdoms' are short lived. The race's genius for battle does not extend itself to statecraft, and their conquests inevitably collapse under a struggle for power between rival leaders. Uruk society is completely male dominated. Females are expected to find a male to support them and begin their life's purpose: breeding. Any female of breeding age that has no male protector is considered available to any male that chooses to take her and support her. Other cultures consider this to be rape. Uruks call it marriage. They extend this practice to captured females from other races. * Warfare - Uruks wage constant war on any group near them until they take what is 'rightfully' theirs. When warbands grow large enough, they spill down into neighboring settlements to rape, murder, raid, and pillage. These bands can take on the proportions of a large town or small city, and roll across the countryside leaving burning wreckage in their wake. * Language - Uruks speak the rough and unflattering Uruk tongue, which has no alphabet. Uruk culture and history is passed along in an oral tradition. * Morale - Normal * Preferred Skills - Melee, Rage * Units - Light Infantry, Light Spearmen, Light Archers, Light Cavalry, King * Factions - Skullsplitter, Bonegrinder" :titles "Orc" :unitmap (unitmap "Uruk Butcher" (unit :name "Uruk Butcher" :summary "* Orc Butchers deal in all things meat. They serve as cooks, surgeons, undertakers, and torturers. * They prefer cleavers, hand axes, and knives in combat.") "Uruk-hai Champion" (unit :name "Uruk-hai Champion" :titles "Brawler, Bodyguard") "Uruk Raider" (unit :name "Uruk Raider") "Uruk Shaman" (unit :name "Uruk Shaman" :summary "* Uruk Shamans teach that everything the Uruks once had was stolen by the other races, and urges them on to ever-greater acts of violence and revenge.") "Uruk Taskmaster" (unit :name "Uruk Taskmaster") "Uruk Veteran" (unit :name "Uruk Veteran") "Uruk War Chief" (unit :name "Uruk War Chief") "Uruk Warrior" (unit :name "Uruk Warrior" :image "Fantasy/Orc_Warrior.png" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee" :level "4") :Military (unitskill :name "Military" :level "3"))))))) "Giant Races" (chapter :name "Giant Races" :sectionmap (sectionmap :Titans (section :name "Titans" :unitmap (unitmap :Atlas (unit :name "Atlas") :Chronos (unit :name "Chronos" :titles "Yog-Sothoth") :Echidna (unit :name "Echidna" :summary "* Mother of Monsters * Children - Cerberus, Chimera, Ethon, Gorgon, Graeae, Gelonus, Ladon, Lernaean Hydra, Nemean Lion, Orthrus, Phaea, Scylla, Sphinx" :titles "Shub-Niggurath") :Gaia (unit :name "Gaia" :titles "Mother Earth, Wyld, Azathoth") :Helios (unit :name "Helios" :titles "The Sun") :Mene (unit :name "Mene" :titles "Selene, The Moon") :Oceanus (unit :name "Oceanus") :Prometheus (unit :name "Prometheus" :titles "The Serpent, Nyarlathotep, Phoenix") :Tartarus (unit :name "Tartarus" :titles "Oblivion") :Typhon (unit :name "Typhon" :summary "* The enemy of Zeus * A vast grisly monster with a hundred snakelike heads that extends in serpentine coils from the waist down."))))) "Mythical Beasts" (chapter :name "Mythical Beasts" :sectionmap (sectionmap "Unique Beasts" (section :name "Unique Beasts" :unitmap (unitmap :Cerberus (unit :name "Cerberus") :Charybdis (unit :name "Charybdis" :summary "* Scylla and Charybdis are two sea monsters situated on opposite sides of a narrow channel of water, so close that sailors avoiding Charybdis will pass too close to Scylla and vice versa. * She takes form as a monstrous mouth. She swallows huge amounts of water three times a day and then belches them back out again creating whirlpools.") :Scylla (unit :name "Scylla" :reference "* You consider me the young apprentice...Caught between the Scylla and Charybdis...Hypnotized by you if I should linger...Staring at the ring around your finger - The Police, Wrapped around your Finger" :summary "* Scylla and Charybdis are two sea monsters situated on opposite sides of a narrow channel of water, so close that sailors avoiding Charybdis will pass too close to Scylla and vice versa. * Scylla is a horribly grotesque sea monster, with six long necks equipped with grisly heads, each of which contained three rows of sharp teeth. Her body consisted of twelve canine legs and a fish's tail."))))) :Shapeshifters (chapter :name "Shapeshifters" :sectionmap (sectionmap :Lycanthropes (section :name "Lycanthropes" :reference "* Beauty and the Beast * The Howling * Underworld * Wolfen" :summary "* Description - A hereditary trait carried by humans and animals. * Personality - Their savagery is their greatest strength, but it threatens to consume them and leave only rage. * Some lycanthropes are more animal-like and hostile to humans. * [Vulnerability] to [Silver] * Loses control under the moon * Preferred Skills: [Lycanthropy], [Natural Weaponry] !Groups * Black Spirals - [[Corrupted]] Werewolves History * The Impergium - 8,000 years ago, humankind was becoming more organized and began systematically killing wolves or destroying their habitats. The Werewolves born from wolves decided that the humans were out of control and leading the world to chaos. They declared the open hunt (or culling) of humans called the Impergium. The Werewolves born from humans saw their own kin murdered by other Werewolves. Whatever the merits of the Impergium, it triggered a civil war between the Werewolf clans with mounting killings and atrocities. The other shapeshifters tried to stay out of the conflict but were quickly forced to take sides. The conflict only ended after the number of Shapeshifters across the world was decimated, especially those born to wolves. Since then the low birth rate of Shapeshifters has taken many races to the brink of extinction. The Impergium remains as a grim reminder of the dangers of letting ones [Rage] overcome reason. The Werewolves are embarassed by their clans' actions. The other Shapeshifters have never forgiven the Werewolves for their folly. Also, many of the Werewolves born of wolves hold deep hatred for the other Werewolves both for their betrayal and for the current state of the wolves in the world." :unitmap (unitmap :Werebat (unit :name "Werebat") :Werebear (unit :name "Werebear") :Werecat (unit :name "Werecat" :image "ModernFantasy/Lycanthrope_Weretiger.png" :reference "Every time it happens... you tell yourself it's love. But it isn't. It's blood. And death. - Cat People" :titles "Rakshasa, Werepanther, Weretiger") :Werecrow (unit :name "Werecrow" :image "ModernFantasy/Lycanthrope_Tengu.png" :summary "* Able to fly, the Werecrows make terrific scouts and spies. Their overwhelming curiousity is matched only by their tendency to gossip." :titles "Tengu, Wereraven" :unitpowermap (unitpowermap "Natural Weaponry" (unitpower :name "Natural Weaponry" :unitabilitymap (unitabilitymap "Feather Blades" (unitability :name "Feather Blades") "Feather Knives" (unitability :name "Feather Knives")))) :unitskillmap (unitskillmap :Hunting (unitskill :name "Hunting" :unitabilitymap (unitabilitymap :Scouting (unitability :name "Scouting"))))) :Wererat (unit :name "Wererat" :image "ModernFantasy/Lycanthrope_Wererat.png" :unitskillmap (unitskillmap :Stealth (unitskill :name "Stealth"))) :Werespider (unit :name "Werespider" :titles "Anasi, Arachne, Kumo" :unitpowermap (unitpowermap :Illusion (unitpower :name "Illusion" :unitabilitymap (unitabilitymap "Dazzling Beauty" (unitability :name "Dazzling Beauty") "Mirror Image" (unitability :name "Mirror Image"))) :Venomous (unitpower :name "Venomous" :unitabilitymap (unitabilitymap "Poison Bite" (unitability :name "Poison Bite") "Poison Spit" (unitability :name "Poison Spit"))))) :Werewolf (unit :name "Werewolf" :image "ModernFantasy/Lycanthrope_Werewolf.png" :reference "* The crescent moon is a double-edged sword. Be wary, lest it cut you." :titles "French/Old English: Loup-garou, Japanese: Ookami otoko"))))) "Undead Creatures" (chapter :name "Undead Creatures" :reference "* Seven Deadly Sins: Envy" :summary "* Description - The dead are normally at rest, but under certain circumstances their spirits return from the [Spirit Realm] and they rise again. Created through different means, the Undead share a common trait. Their life is artificial, a soulless parody of true life. Above all they envy the life that they lack, and they may only maintain their unlife by taking life from others. * Personality - Despite their reputation, the Undead are not innately evil. They retain at least some of their original personalities, but their new existence often forces them to reevaluate their morals. Most of the more 'ethical' Undead end their own miserable existences. * Spirit - Undead cannot recover Spirit except by stealing it from the living. Slaying the living is always worth 1 extra [Spirit] to any undead. Note: Undead are more connected to the spirit world than the living world and therefore are permanently banished from the living world if their Spirit ever drops to zero. Without a [Spirit], they many never use any [Naturalism] or [Spiritualism] magics. Types * Traumatic death - Focused completely on the trauma of their death, they are drawn to the living and end up reenacting their death with others. - Burning Dead, Drowned, Frozen Dead, Scarecrow, Wendigo. * Incomplete business - These are compelled to attempt to complete their goals. Sometimes the completion of the goal is enough to let them rest. Sometimes they continue endlessly trying to complete an impossible goal. - Shades, Poltergeists * Necromancy - Lich, Mummies, Night Terror, Skeletons, Zombies * Raised by another Undead - Ghoul, Skeleton Crew, Vampire." :titles "Restless, Restless Dead, Risen, Undeath, Unquiet" :sectionmap (sectionmap "Vampires, Elder" (section :name "Vampires, Elder" :unitmap (unitmap :Kali (unit :name "Kali" :summary "* Tzimisce Methuselah") :Set (unit :name "Set" :summary "* Setite Methuselah"))) "Vampires, Anarchs" (section :name "Vampires, Anarchs" :summary "* The strict caste system of the Camarilla does not favor new Vampires. Many newly embraced reject the machinations of the elders and live as they can on the fringe. Anarchs rely on each other to protect themselves from the actions of the Camarilla and the Sabbat. The larger organizations treat Anarchs like homeless people, largely ignoring them unless they get in their way. The Anarchs understand that the other groups are bound by rules, and they will use this to their advantage. In any situation, the Anarchs are wild cards, potentially able to shift a result one way or the other. The Anarchs have one crucial advantage over the Camarilla and Sabbat: they have nothing to lose.") "Vampires, Camarilla" (section :name "Vampires, Camarilla" :titles "Neophyte, Elder, Prince, Sheriff" :unitmap (unitmap :Brujah (unit :name "Brujah" :titles "Bully, Bruiser" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Strength (unitpower :name "Strength"))) :Gangrel (unit :name "Gangrel" :titles "Animal, Protector" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Animalism (unitpower :name "Animalism"))) :Malkavian (unit :name "Malkavian" :summary "* Cursed by Madness * Malkalv - The philosophic, antedeluvian sire of their clan. When he was destroyed with the First City. his childer began to gain the signature Madness. Some say his spirit continues through his blood and connects his childer. Others propose the preposterous notion that Malkav was a an embraced Angel. * Kinship - Unlike other tribes, the Malkavians have a natural understanding and kinship toward each other. It is rare that they outright betray one another." :titles "Jester, Maniac, Nutcase, Prankster, Psychotic" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Dominiation (unitpower :name "Dominiation") :Senses (unitpower :name "Senses") :Madness (unitpower :name "Madness")) :unitskillmap (unitskillmap :Stealth (unitskill :name "Stealth"))) :Nosferatu (unit :name "Nosferatu" :titles "Sewer Rat" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Invisibility (unitpower :name "Invisibility")) :unitskillmap (unitskillmap :Stealth (unitskill :name "Stealth"))) :Toreador (unit :name "Toreador" :reference "* We come into this stale and plain stale world. So we spend our time, searching for that one sublime revelation. To fill the void. To lose ourselves in beauty and perfection. Beauty can be elegant, seductive, full of pleasure, Raw, Violent, Lethal. Let me help us find it. To lose ourselves. Come closer. I am a beautiful way to die. - Vampire: Bloodlines 2 * She'll only come out at nights. The lean and hungry type... I wouldn't if I were you. I know what she can do. She's deadly man, she could really rip your world apart. Mind over matter. Ooh, the beauty is there but a beast is in the heart. Oh, here she comes. Watch out boy she'll chew you up. Oh, here she comes. She's a maneater. - Hall and Oates/No Hard Feelings, Maneater" :summary "* Beauty is both a blessing and a curse * Toreadors were key to founding the Camarilla and are among the most powerful and influencial clans. * The Roses in the Garden - The Toreador who are obscessed with politics, conspiring on casual walks. * Founder - It is said that the Clan's founder, Arikel was a mortal painter and/or sculptress and twin sister of Malkav in the First City. Famed throughout the lands for her work, after her Embrace she painted a mural on which the past, present and future of Kindred society was depicted. When Caine saw a terrible future for his race, he cursed her with the affliction that affects Toreador today – the art that she loved most dearly would now be her obsession and distraction above all things. * Weakness - Fascination" :titles "Artists, Clan of Roses, Degenerate, Gossips, Obsessives" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Quickness (unitpower :name "Quickness") :Senses (unitpower :name "Senses") :Presence (unitpower :name "Presence"))) :Tremere (unit :name "Tremere" :image "ModernFantasy/Vampire_Tremere.png" :summary "* The Tremere is the second youngest clan having appeared in the Dark Ages. * History - The Tremere began as House Tremere, mages of the Order of Hermes named for their leader and founder, Tremere. At the end of the first millennium, the members of House Tremere realized the Hermetic arts were failing and found its immortality potions no longer working. House Tremere undertook numerous experiments, but it was Goratrix who devised a solution in his investigation of vampires. In 1022, Goratrix invited Tremere and six of the founder's closest advisers to participate in the completed ritual, which promised true immortality. Whether Goratrix knew what would happen is known only by him and, perhaps, Tremere, but at the completion of the ritual the participants fell unconscious and were reborn as vampires, their avatars destroyed and magical abilities lost. The mages had gained their immortality but lost the power they lived for. In time, the Tzimisce made war against House Tremere in retribution for the Fiends that had been made part of Goratrix's experiments. The Order of Hermes also became suspicious of diabolical practices being performed by the increasingly secretive House. In 1037 Tremere gathered the seven newly-made Cainites and forced the blood bond upon them. He then declared to them that House Tremere would be restructured with a new pyramid hierarchy, placing himself at the top as Primus of House and clan Tremere and his seven closest followers forming the Inner Council of Seven directly under him. They would slowly begin Embracing the rest of the House, with each initiate being bound to the Inner Council to ensure their loyalty. In time, all members of House Tremere would die or become vampires. While Tremere and Etrius pursued their own research throughout Europe in converting the hermetic arts into Thaumaturgy, Goratrix once again returned to his laboratories with his apprentices at hand. After years of experimentation on captured Tzimisce, Nosferatu, and Gangrel, he succeeded in creating a Gargoyle in 1121, and by 1125 the hybrids were serving as shock troops against the Fiends. Nevertheless, the Tremere found themselves third-class citizens among the undead. Whatever boldness Tremere had shown in entering the night was ignored by the staunchly traditionalist clans, and they were often forced from cities by princes who did not look kindly on their presumption. As he and Etrius rapidly acquired more vampiric lore they discovered the history of Caine and the Antediluvians, as well as the benefits of diablerie. Seeking to establish themselves as a clan proper, the Tremere sought a clan founder to diablerize and settled on Saulot, the enigmatic founder of the Salubri clan. In 1133, Tremere and the Inner Council discovered Saulot's tomb in the Anatolian desert. Tremere diablerized the Antediluvian and promptly entered torpor, leaving the Inner Council to lead the clan and destroy the remaining Salubri. As with everything else that the Tremere had done to this point, the result was a mixed blessing. The Tremere were entrenched in many Cainite courts, their services as mages making them indispensable to princes across Europe. They were now accepted as one of the Low Clans, albeit considered usurpers, distrusted warlocks, and known diablerists. In the early years of the 21st century, the Intellegence agencies of the United States managed to gain access to SchreckNet and gained firsthand knowledge of the existence of a race of undead bloodsuckers that were spread in all corners of the world. Sharing their knowledge with other intelligence agencies, the united secret services contacted the Vatican, whom they knew to have experience fighting the undead. After years of careful research, the Second Inquisition had targeted Vienna as the 'capital of vampires' and prepared a strike against their headquarters. In 2008, a united USSOCOM and Vatican ESOG force stormed the Vienna Chantry of Clan Tremere and destroyed it, blaming it to an ISIS terror attack to the public. London, Las Vegas, Paris, and Marseilles were largely cleared of vampiric activity, with numerous captured vampires being placed in black sites and experimented upon to discover their weaknesses. The Inner Council of Seven were slain and their Blood Bonds shattered. Since then the once monolithic Tremere structure has completely fallen apart." :titles "Blood Sorcerer, Broken Clan, Pyramid, Usurpers, Warlock, Witch" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") "Blood Magic" (unitpower :name "Blood Magic"))) :Ventrue (unit :name "Ventrue" :titles "Bluebloods, Manipulator, Know-it-all" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Domination (unitpower :name "Domination") :Toughness (unitpower :name "Toughness")) :unitskillmap (unitskillmap :Influence (unitskill :name "Influence"))))) "Vampires, Sabbat" (section :name "Vampires, Sabbat" :unitmap (unitmap :Lasombra (unit :name "Lasombra" :image "ModernFantasy/Vampire_Lasombra.png" :titles "Dark Priest" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism")) :unitskillmap (unitskillmap :Influence (unitskill :name "Influence"))) :Tzimisce (unit :name "Tzimisce" :image "ModernFantasy/Vampire_Tzimisce.png" :reference "The Tzimisce take pleasure in shaping themselves into a variety of inhuman forms. Distended skulls, elongated fingers, polychromatic mottling are often displayed to demonstrate their alien superiority." :summary "* The Tzimisce's extensive use of Fleshcraft upon themselves, their servants, and their foes, have made them the most bizarre and alien of the Vampire clans. Fortunately, they are solitary by nature preferring isolated locale to practice their horrid techniques on their hapless prey. * Examples: Backroom Surgeon, Carny Folk, Dracula, Inquisitor, Kali, Mortician, Nazi Scientist, Tatoo Artist, Toturer, Vivisectionist" :titles "Monster, Alien" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Fleshcraft (unitpower :name "Fleshcraft")) :unitskillmap (unitskillmap :Intimidation (unitskill :name "Intimidation"))))) "Vampires, Independent" (section :name "Vampires, Independent" :unitmap (unitmap :Kuei-Jin (unit :name "Kuei-Jin") :Setite (unit :name "Setite" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism"))))) :Vampires (section :name "Vampires" :reference "* Dracula * I died... so many years ago. You can make me feel like it isn't so. ... I know, I should go, but I follow you like a man possessed. There's a traitor here beneath my breast, and it hurts me more than you've ever guessed. If my heart could beat, it would break my chest. But I can see, that you're unimpressed, so leave me be and let me rest in peace. Let me get some sleep. Let me take my love and bury it six feet deep. - Spike, Buff the Vampire Slayer * Cause I’ve made some real big mistakes. But you make the worst one look fine. I should’ve known it was strange. You only come out at night. I used to think I was smart. But you made me look so naïve. The way you sold me for parts. As you sunk your teeth into me, oh. Bloodsucker, dreamcrusher. Bleeding me dry like a damn vampire - Olivia Rodrigo, Vampire * Victor: I need you to understand something very, very clearly. The place we're going, if you repeat in front of them that she knows about a 'thing', she's dead. Everyone she knows is dead. Anyone she might have texted is dead. So you're going to have to learn from this exact second, how to keep a secret. There's a little show we have to put on. You might call it a sort of masquerade that we all have to live into, that none of this is real. Never in your life did you think this is real, and is has been the entire time. So learn to lie to your girlfriend if you want to live. Nelli G: Or if you want to live. Jasper: That too. - L.A By Night * Annabelle: You seem reasonable. Why do you follow their orders?... Jasper: I follow his orders because if I don't, I get left in that sun that hurts so much... I work with them because if I don't, I get introduced to the dawn. I do a lot of things, so I get to keep living... It's a game we all play, so we get to keep doing this. Talking, living, walking. - L.A By Night" :summary "* Description - Among most powerful and feared of all undead, Vampires are among the oldest known undead creatures with legends that go back to the first intelligent humans. They possess the abilities that they had in life as well as gaining unique vampiric powers. * Feeding - Vampires regain Spirit only by drinking the blood of the living. Some Eastern Vampires eat the flesh of the living instead. As the Spirit of a Vampire decreases, the Vampire becomes more savage and beastial. * Morale - Normal, Low vs. Fire and Sunlight. Ironically, the one thing that truly terrifies these eternal, murderous beings is the end of their own cursed lives. * Vulnerability to Fire - The cleansing touch of Fire will rapidly consume a Vampire. * Vulnerability to Sunlight - The cleansing touch of Sunlight will ignite a Vampire on Fire. During daylight hours, Vampires fall into a deathlike sleep. Contrary to some sources, arificial sunlight has no effect on them. * Vulnerability to Silver - The cleansing touch of Silver will ignite a Vampire on Fire. Even their reflection is destroyed by Silver. Contrary to some sources, non-silver mirrors still reflect the image of a Vampire. * Immunity to Bleeding - Vampire blood can move on its own and will not leave the body without force. * Biology - Vampires are created when one Vampire drains a person to the brink of death and then feeds their own blood to the victim. This is called: The Embrace. At this moment, the victim has a chance to reject the Embrace, and die peacefully. If the victim accepts the Embrace, the blood will rapidly reach the victim's heart and the transformation to Vampire will immediately begin. * Nature - There is much conjecture about how a Vampire functions, but it is certain that the blood of a Vampire is the source of its unnatural existence. Some believe that the blood itself is a form of evil, magical, parasite centered on the heart that animates the Vampire's body. * Masquerade - During the day, Vampires are completely vulnerable. Therefore, they avoid drawing attention to themselves. They pretend to be normal people while manipulating from behind the scenes. Vampires appear as near perfect humans, but this too is a mask. Vampires pretend at being sophisticated and refined, but always behind this is their true, savage, bestial nature. * Sire - The vampire's creator. * Childer - The relationship of a vampire to a Sire. * Book of Nod - The vampiric history/bible. * Antitribu - Those who choose to oppose their clan, joining the Camarilla or Sabbat respectively." :titles "Cainite, Kindred, Leech, Lick" :sectionmap (sectionmap "Vampires, Elder" (section :name "Vampires, Elder" :unitmap (unitmap :Kali (unit :name "Kali" :summary "* Tzimisce Methuselah") :Set (unit :name "Set" :summary "* Setite Methuselah"))) "Vampires, Anarchs" (section :name "Vampires, Anarchs" :summary "* The strict caste system of the Camarilla does not favor new Vampires. Many newly embraced reject the machinations of the elders and live as they can on the fringe. Anarchs rely on each other to protect themselves from the actions of the Camarilla and the Sabbat. The larger organizations treat Anarchs like homeless people, largely ignoring them unless they get in their way. The Anarchs understand that the other groups are bound by rules, and they will use this to their advantage. In any situation, the Anarchs are wild cards, potentially able to shift a result one way or the other. The Anarchs have one crucial advantage over the Camarilla and Sabbat: they have nothing to lose.") "Vampires, Camarilla" (section :name "Vampires, Camarilla" :titles "Neophyte, Elder, Prince, Sheriff" :unitmap (unitmap :Brujah (unit :name "Brujah" :titles "Bully, Bruiser" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Strength (unitpower :name "Strength"))) :Gangrel (unit :name "Gangrel" :titles "Animal, Protector" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Animalism (unitpower :name "Animalism"))) :Malkavian (unit :name "Malkavian" :summary "* Cursed by Madness * Malkalv - The philosophic, antedeluvian sire of their clan. When he was destroyed with the First City. his childer began to gain the signature Madness. Some say his spirit continues through his blood and connects his childer. Others propose the preposterous notion that Malkav was a an embraced Angel. * Kinship - Unlike other tribes, the Malkavians have a natural understanding and kinship toward each other. It is rare that they outright betray one another." :titles "Jester, Maniac, Nutcase, Prankster, Psychotic" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Dominiation (unitpower :name "Dominiation") :Senses (unitpower :name "Senses") :Madness (unitpower :name "Madness")) :unitskillmap (unitskillmap :Stealth (unitskill :name "Stealth"))) :Nosferatu (unit :name "Nosferatu" :titles "Sewer Rat" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Invisibility (unitpower :name "Invisibility")) :unitskillmap (unitskillmap :Stealth (unitskill :name "Stealth"))) :Toreador (unit :name "Toreador" :reference "* We come into this stale and plain stale world. So we spend our time, searching for that one sublime revelation. To fill the void. To lose ourselves in beauty and perfection. Beauty can be elegant, seductive, full of pleasure, Raw, Violent, Lethal. Let me help us find it. To lose ourselves. Come closer. I am a beautiful way to die. - Vampire: Bloodlines 2 * She'll only come out at nights. The lean and hungry type... I wouldn't if I were you. I know what she can do. She's deadly man, she could really rip your world apart. Mind over matter. Ooh, the beauty is there but a beast is in the heart. Oh, here she comes. Watch out boy she'll chew you up. Oh, here she comes. She's a maneater. - Hall and Oates/No Hard Feelings, Maneater" :summary "* Beauty is both a blessing and a curse * Toreadors were key to founding the Camarilla and are among the most powerful and influencial clans. * The Roses in the Garden - The Toreador who are obscessed with politics, conspiring on casual walks. * Founder - It is said that the Clan's founder, Arikel was a mortal painter and/or sculptress and twin sister of Malkav in the First City. Famed throughout the lands for her work, after her Embrace she painted a mural on which the past, present and future of Kindred society was depicted. When Caine saw a terrible future for his race, he cursed her with the affliction that affects Toreador today – the art that she loved most dearly would now be her obsession and distraction above all things. * Weakness - Fascination" :titles "Artists, Clan of Roses, Degenerate, Gossips, Obsessives" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Quickness (unitpower :name "Quickness") :Senses (unitpower :name "Senses") :Presence (unitpower :name "Presence"))) :Tremere (unit :name "Tremere" :image "ModernFantasy/Vampire_Tremere.png" :summary "* The Tremere is the second youngest clan having appeared in the Dark Ages. * History - The Tremere began as House Tremere, mages of the Order of Hermes named for their leader and founder, Tremere. At the end of the first millennium, the members of House Tremere realized the Hermetic arts were failing and found its immortality potions no longer working. House Tremere undertook numerous experiments, but it was Goratrix who devised a solution in his investigation of vampires. In 1022, Goratrix invited Tremere and six of the founder's closest advisers to participate in the completed ritual, which promised true immortality. Whether Goratrix knew what would happen is known only by him and, perhaps, Tremere, but at the completion of the ritual the participants fell unconscious and were reborn as vampires, their avatars destroyed and magical abilities lost. The mages had gained their immortality but lost the power they lived for. In time, the Tzimisce made war against House Tremere in retribution for the Fiends that had been made part of Goratrix's experiments. The Order of Hermes also became suspicious of diabolical practices being performed by the increasingly secretive House. In 1037 Tremere gathered the seven newly-made Cainites and forced the blood bond upon them. He then declared to them that House Tremere would be restructured with a new pyramid hierarchy, placing himself at the top as Primus of House and clan Tremere and his seven closest followers forming the Inner Council of Seven directly under him. They would slowly begin Embracing the rest of the House, with each initiate being bound to the Inner Council to ensure their loyalty. In time, all members of House Tremere would die or become vampires. While Tremere and Etrius pursued their own research throughout Europe in converting the hermetic arts into Thaumaturgy, Goratrix once again returned to his laboratories with his apprentices at hand. After years of experimentation on captured Tzimisce, Nosferatu, and Gangrel, he succeeded in creating a Gargoyle in 1121, and by 1125 the hybrids were serving as shock troops against the Fiends. Nevertheless, the Tremere found themselves third-class citizens among the undead. Whatever boldness Tremere had shown in entering the night was ignored by the staunchly traditionalist clans, and they were often forced from cities by princes who did not look kindly on their presumption. As he and Etrius rapidly acquired more vampiric lore they discovered the history of Caine and the Antediluvians, as well as the benefits of diablerie. Seeking to establish themselves as a clan proper, the Tremere sought a clan founder to diablerize and settled on Saulot, the enigmatic founder of the Salubri clan. In 1133, Tremere and the Inner Council discovered Saulot's tomb in the Anatolian desert. Tremere diablerized the Antediluvian and promptly entered torpor, leaving the Inner Council to lead the clan and destroy the remaining Salubri. As with everything else that the Tremere had done to this point, the result was a mixed blessing. The Tremere were entrenched in many Cainite courts, their services as mages making them indispensable to princes across Europe. They were now accepted as one of the Low Clans, albeit considered usurpers, distrusted warlocks, and known diablerists. In the early years of the 21st century, the Intellegence agencies of the United States managed to gain access to SchreckNet and gained firsthand knowledge of the existence of a race of undead bloodsuckers that were spread in all corners of the world. Sharing their knowledge with other intelligence agencies, the united secret services contacted the Vatican, whom they knew to have experience fighting the undead. After years of careful research, the Second Inquisition had targeted Vienna as the 'capital of vampires' and prepared a strike against their headquarters. In 2008, a united USSOCOM and Vatican ESOG force stormed the Vienna Chantry of Clan Tremere and destroyed it, blaming it to an ISIS terror attack to the public. London, Las Vegas, Paris, and Marseilles were largely cleared of vampiric activity, with numerous captured vampires being placed in black sites and experimented upon to discover their weaknesses. The Inner Council of Seven were slain and their Blood Bonds shattered. Since then the once monolithic Tremere structure has completely fallen apart." :titles "Blood Sorcerer, Broken Clan, Pyramid, Usurpers, Warlock, Witch" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") "Blood Magic" (unitpower :name "Blood Magic"))) :Ventrue (unit :name "Ventrue" :titles "Bluebloods, Manipulator, Know-it-all" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Domination (unitpower :name "Domination") :Toughness (unitpower :name "Toughness")) :unitskillmap (unitskillmap :Influence (unitskill :name "Influence"))))) "Vampires, Sabbat" (section :name "Vampires, Sabbat" :unitmap (unitmap :Lasombra (unit :name "Lasombra" :image "ModernFantasy/Vampire_Lasombra.png" :titles "Dark Priest" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism")) :unitskillmap (unitskillmap :Influence (unitskill :name "Influence"))) :Tzimisce (unit :name "Tzimisce" :image "ModernFantasy/Vampire_Tzimisce.png" :reference "The Tzimisce take pleasure in shaping themselves into a variety of inhuman forms. Distended skulls, elongated fingers, polychromatic mottling are often displayed to demonstrate their alien superiority." :summary "* The Tzimisce's extensive use of Fleshcraft upon themselves, their servants, and their foes, have made them the most bizarre and alien of the Vampire clans. Fortunately, they are solitary by nature preferring isolated locale to practice their horrid techniques on their hapless prey. * Examples: Backroom Surgeon, Carny Folk, Dracula, Inquisitor, Kali, Mortician, Nazi Scientist, Tatoo Artist, Toturer, Vivisectionist" :titles "Monster, Alien" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism") :Fleshcraft (unitpower :name "Fleshcraft")) :unitskillmap (unitskillmap :Intimidation (unitskill :name "Intimidation"))))) "Vampires, Independent" (section :name "Vampires, Independent" :unitmap (unitmap :Kuei-Jin (unit :name "Kuei-Jin") :Setite (unit :name "Setite" :unitpowermap (unitpowermap :Vampirism (unitpower :name "Vampirism"))))))))))))
nx/tactics/books/bookloader
Description:
  • Book loading tools
Package Name:
  • nx/tactics/books/bookloader
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
    fil
    vx/data/file
    typ
    vx/type
    xml
    vx/data/xml
Types:
Constants:
Functions:
  • ability<-ability-key-value, ability<-ability-stringmap, ability<-ability-xmlchild, ability<-xml, book<-book-key-value, book<-book-stringmap, book<-book-xml, book<-book-xmlchapter, book<-book-xmlchild, book<-xml, book<-xmldoc, book<-xmllist, boolean-write<-book, book-read<-bookname, boolean-write<-booknames, chapter<-chapter-key-value, chapter<-chapter-stringmap, chapter<-chapter-xmlchild, chapter<-chapter-xmlsection, chapter<-xml, damage<-damage-key-value, damage<-damage-stringmap, damage<-damage-xmlchild, damage<-xml, file-read<-bookname, file-write<-book, item<-item-key-value, item<-item-stringmap, item<-item-xmlchild, item<-xml, location<-location-key-value, location<-location-stringmap, location<-location-xmlchild, location<-xml, modifier<-xml, power<-power-key-value, power<-power-stringmap, power<-power-xmlchild, power<-xml, power<-power-xmlability, power<-power-xmlspecialty, rule<-rule-key-value, rule<-rule-stringmap, rule<-rule-xmlchild, rule<-xml, scenario<-scenario-key-value, scenario<-scenario-stringmap, scenario<-scenario-xmlchild, scenario<-xml, section<-section-key-value, section<-section-stringmap, section<-section-xmlchild, section<-section-xmldamage, section<-section-xmlitem, section<-section-xmllocation, section<-section-xmlpower, section<-section-xmlrule, section<-section-xmlscenario, section<-section-xmlsection, section<-section-xmlskill, section<-section-xmlterrain, section<-section-xmlunit, section<-xml, skill<-skill-key-value, skill<-skill-stringmap, skill<-skill-xmlchild, skill<-skill-xmlability, skill<-skill-xmlspecialty, skill<-xml, specialty<-specialty-key-value, specialty<-specialty-stringmap, specialty<-specialty-xmlchild, specialty<-xml, string-read<-bookname, string-vxlisp<-book, string-writename<-book, terrain<-terrain-key-value, terrain<-terrain-stringmap, terrain<-terrain-xmlchild, terrain<-xml, unit<-unit-key-value, unit<-unit-stringmap, unit<-unit-xmlchild, unit<-unit-xmlpower, unit<-unit-xmlskill, unit<-unit-xmlweakness, unit<-xml, unitability<-unitability-key-value, unitability<-unitability-stringmap, unitability<-unitability-xmlchild, unitability<-xml, unititem<-unititem-key-value, unititem<-unititem-stringmap, unititem<-unititem-xmlchild, unititem<-xml, unitpower<-unitpower-key-value, unitpower<-unitpower-stringmap, unitpower<-unitpower-xmlability, unitpower<-unitpower-xmlchild, unitpower<-unitpower-xmlitem, unitpower<-unitpower-xmlspecialty, unitpower<-xml, unitskill<-unitskill-key-value, unitskill<-unitskill-stringmap, unitskill<-unitskill-xmlability, unitskill<-unitskill-xmlchild, unitskill<-unitskill-xmlitem, unitskill<-unitskill-xmlspecialty, unitskill<-xml, unitspecialty<-unitspecialty-key-value, unitspecialty<-unitspecialty-stringmap, unitspecialty<-unitspecialty-xmlchild, unitspecialty<-xml, unitweakness<-xml, weakness<-xml, xml-read<-bookname
Source Code:
  • (package nx/tactics/books/bookloader :libs (lib base :path nx/tactics/base) (lib fil :path vx/data/file) (lib typ :path vx/type) (lib xml :path vx/data/xml) :doc "Book loading tools") (func ability<-ability-key-value : base/ability [current : base/ability key : string value : string] (switch : base/ability key (case "" current) (case (list "name" "image") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/ability :prop key :value value))))) :doc "Returns a modified ability from a key value.") (func ability<-ability-stringmap : base/ability [ability : base/ability propmap : stringmap] (any<-map-start-reduce : base/ability propmap ability ability<-ability-key-value) :test (test (base/ability :name "name" :image "image") (ability<-ability-stringmap (empty base/ability) (stringmap :name "name" :image "image"))) :doc "Returns a new ability from a propmap.") (func ability<-ability-xmlchild : base/ability [ability : base/ability child : xml/xml] (let : base/ability [tag : string := (:tag child)] (switch : base/ability tag (case "" ability) (case (list "reference" "summary" "titles") (copy ability tag (xml/string-first<-xml child))) (else (copy ability (msg<-error :invalidtagfound (anymap :type base/ability :tag tag)))))) :test (test (base/ability :titles "titles") (ability<-ability-xmlchild (empty base/ability) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified ability based on a given child xml.") (func ability<-xml : base/ability [xml : xml/xml] (let : base/ability [propmap : stringmap := (:propmap xml) ability : base/ability := (ability<-ability-stringmap (empty base/ability) propmap)] (any<-list-start-reduce : base/ability (:children xml) ability ability<-ability-xmlchild)) :test (test (base/ability :name "name" :image "image" :titles "titles" :reference "reference") (ability<-xml (xml/xml :tag "ability" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))))))) :doc "Returns a ability from a given xml.") (func book<-book-key-value : base/book [current : base/book key : string value : string] (switch : base/book key (case "" current) (case (list "name" "image") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/book :prop key :value value))))) :test (test (base/book :name "nm") (book<-book-key-value (empty base/book) "name" "nm")) (test (base/book :name "image") (book<-book-key-value (empty base/book) "name" "image")) :doc "Returns a modified book from a key value.") (func book<-book-stringmap : base/book [book : base/book propmap : stringmap] (any<-map-start-reduce : base/book propmap book book<-book-key-value) :test (test (base/book :name "name" :image "image") (book<-book-stringmap (empty base/book) (stringmap :name "name" :image "image"))) :doc "Returns a new book from a propmap.") (func book<-book-xml : base/book [current : base/book child : xml/xml] (let : base/book [tag : string := (:tag child)] (switch : base/book tag (case "" current) (case "!--" current) (case "?xml" current) (case "doc" (if : base/book (then (is-empty current) (book<-xmldoc child)) (else (copy current (msg<-error :duplicatetagfound (anymap :type base/book :tag tag)))))) (else (copy current (msg<-error :invalidtagfound (anymap :type base/book :tag tag)))))) :test (test (base/book :name "name1") (book<-book-xml (empty base/book) (xml/xml :tag "doc" :propmap (stringmap :name "name1")))) (test (empty base/book) (book<-book-xml (empty base/book) (xml/xml :tag "?xml"))) (test (base/book :name "name1" (msgblock (msg :code ":duplicatetagfound" :detail (anymap :type nx/tactics/base/book :tag "doc") :severity 2))) (book<-book-xml (base/book :name "name1") (xml/xml :tag "doc"))) :doc "Returns an altered book based on xml child.") (func book<-book-xmlchapter : base/book [book : base/book xml : xml/xml] (let : base/book [chapter : base/chapter := (chapter<-xml xml) name : string := (:name chapter) origmap : base/chaptermap := (:chaptermap book) chgmap : base/chaptermap := (copy origmap name chapter)] (copy book :chaptermap chgmap)) :test (test (base/book :chaptermap (base/chaptermap :chapter1 (base/chapter :name "chapter1"))) (book<-book-xmlchapter (empty base/book) (xml/xml :tag "chapter" :propmap (stringmap :name "chapter1")))) :doc "Returns an altered book based on xmlchapter.") (func book<-book-xmlchild : base/book [book : base/book child : xml/xml] (let : base/book [tag : string := (:tag child)] (switch : base/book tag (case "" book) (case (list "reference" "summary" "titles") (copy book tag (xml/string-first<-xml child))) (case "chapter" (book<-book-xmlchapter book child)) (else (copy book (msg<-error :invalidtagfound (anymap :type base/book :tag tag)))))) :test (test (base/book :titles "titles") (book<-book-xmlchild (empty base/book) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) (test (base/book :chaptermap (base/chaptermap :chapter1 (base/chapter :name "chapter1"))) (book<-book-xmlchild (empty base/book) (xml/xml :tag "chapter" :propmap (stringmap :name "chapter1")))) :doc "Returns a modified book based on a given child xml.") (func book<-xml : base/book [xml : xml/xml] (book<-xmllist (:children xml)) :test (test (base/book :name "name1") (book<-xml (xml/xml :children (xml/xmllist (xml/xml :tag "?xml") (xml/xml :tag "doc" :propmap (stringmap :name "name1")))))) :doc "Returns a book from a given top level xml.") (func book<-xmldoc : base/book [xml : xml/xml] (let : base/book [propmap : stringmap := (:propmap xml) children : xmllist := (:children xml) book : base/book := (book<-book-stringmap (empty base/book) propmap)] (any<-list-start-reduce : base/book children book book<-book-xmlchild)) :test (test (base/book :name "name1" :image "image1" :titles "titles1" :reference "reference1" :chaptermap (base/chaptermap :chapter1 (base/chapter :name "chapter1"))) (book<-xmldoc (xml/xml :tag "doc" :propmap (stringmap :name "name1" :image "image1") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles1"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference1"))) (xml/xml :tag "chapter" :propmap (stringmap :name "chapter1")))))) :doc "Returns a book from a given xml.") (func book<-xmllist : base/book [xmllist : xml/xmllist] (any<-list-start-reduce : base/book xmllist (empty base/book) book<-book-xml) :test (test (base/book :name "name1") (book<-xmllist (xml/xmllist (xml/xml :tag "?xml") (xml/xml :tag "doc" :propmap (stringmap :name "name1"))))) :doc "Returns a book from a given xml.") (func boolean-write<-book : boolean [book : base/book] (let : boolean [text : string := (string-vxlisp<-book book) file : fil/file := (file-write<-book book)] (boolean-write<-file-string file text)) :context :doc "Returns boolean after writing book as a file.") (func book-read<-bookname : base/book [bookname : string] (let : base/book [xml : xml/xml := (xml-read<-bookname bookname)] (book<-xml xml)) :context :doc "Returns a book by loading the given Xml filename.") (func boolean-write<-booknames : boolean [booknames : stringlist] (let : boolean [bools : booleanlist := (list<-list : booleanlist booknames (fn : boolean [bookname : string] (let : boolean [book : base/book := (book-read<-bookname bookname)] (boolean-write<-book book))))] (and bools)) :context :doc "Returns boolean after writing book as a file.") (func chapter<-chapter-key-value : base/chapter [current : base/chapter key : string value : string] (switch : base/chapter key (case "" current) (case (list "name" "image") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/chapter :prop key :value value))))) :doc "Returns a modified chapter from a key value.") (func chapter<-chapter-stringmap : base/chapter [chapter : base/chapter propmap : stringmap] (any<-map-start-reduce : base/chapter propmap chapter chapter<-chapter-key-value) :test (test (base/chapter :name "name" :image "image") (chapter<-chapter-stringmap (empty base/chapter) (stringmap :name "name" :image "image"))) :doc "Returns a new book from a propmap.") (func chapter<-chapter-xmlchild : base/chapter [chapter : base/chapter child : xml/xml] (let : base/chapter [tag : string := (:tag child)] (switch : base/chapter tag (case "" chapter) (case (list "reference" "summary" "titles") (copy chapter tag (xml/string-first<-xml child))) (case "section" (chapter<-chapter-xmlsection chapter child)) (else (copy chapter (msg<-error :invalidtagfound (anymap :type base/chapter :tag tag)))))) :test (test (base/chapter :titles "titles") (chapter<-chapter-xmlchild (empty base/chapter) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified chapter based on a given child Xml.") (func chapter<-chapter-xmlsection : base/chapter [chapter : base/chapter xmlsection : xml/xml] (let : base/chapter [section : base/section := (section<-xml xmlsection) name : string := (:name section) sectionmap : base/sectionmap := (:sectionmap section) chgmap : base/sectionmap := (copy sectionmap name section)] (copy chapter :sectionmap chgmap)) :doc "Return a chapter with new section added to sectionmap") (func chapter<-xml : base/chapter [xml : xml/xml] (let : base/chapter [propmap : stringmap := (:propmap xml) chap : base/chapter := (chapter<-chapter-stringmap (empty base/chapter) propmap)] (any<-list-start-reduce : base/chapter (:children xml) chap chapter<-chapter-xmlchild)) :test (test (base/chapter :name "name" :image "image" :titles "titles" :reference "reference" :sectionmap (base/sectionmap :section1 (base/section :name "section1"))) (chapter<-xml (xml/xml :tag "chapter" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))) (xml/xml :tag "section" :propmap (stringmap :name "section1")))))) :doc "Returns a chapter from a given Xml.") (func damage<-damage-key-value : base/damage [current : base/damage key : string value : string] (switch : base/damage key (case "" current) (case (list "name" "image" "classification") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/damage :prop key :value value))))) :doc "Returns a modified damage from a key value.") (func damage<-damage-stringmap : base/damage [damage : base/damage propmap : stringmap] (any<-map-start-reduce : base/damage propmap damage damage<-damage-key-value) :test (test (base/damage :name "name" :image "image") (damage<-damage-stringmap (empty base/damage) (stringmap :name "name" :image "image"))) :doc "Returns a damage from a propmap.") (func damage<-damage-xmlchild : base/damage [damage : base/damage child : xml/xml] (let : base/damage [tag : string := (:tag child)] (switch : base/damage tag (case "" damage) (case (list "reference" "summary" "titles") (copy damage tag (xml/string-first<-xml child))) (else (copy damage (msg<-error :invalidtagfound (anymap :type base/damage :tag tag)))))) :test (test (base/damage :titles "titles") (damage<-damage-xmlchild (empty base/damage) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified damage based on a given child Xml.") (func damage<-xml : base/damage [xml : xml/xml] (let : base/damage [propmap : stringmap := (:propmap xml) damage : base/damage := (damage<-damage-stringmap (empty base/damage) propmap)] (any<-list-start-reduce : base/damage (:children xml) damage damage<-damage-xmlchild)) :doc "Returns a damage from a given xml.") (func file-read<-bookname : fil/file [bookname : string] (fil/file :path "resources/books" :name (string bookname ".xml")) :doc "Returns a file from a bookname.") (func file-write<-book : fil/file [book : base/book] (let : fil/file [bookname : string := (string-writename<-book book)] (fil/file :path "resources/books" :name (string bookname ".vxlisp"))) :doc "Returns a file with string from book") (func item<-item-key-value : base/item [current : base/item key : string value : string] (switch : base/item key (case "" current) (case (list "name" "image" "classification" "length" "mass" "muzzlevelocity" "range" "rof") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/item :prop key :value value))))) :doc "Returns a modified item from a key value.") (func item<-item-stringmap : base/item [item : base/item propmap : stringmap] (any<-map-start-reduce : base/item propmap item item<-item-key-value) :doc "Returns a new item from a propmap.") (func item<-item-xmlchild : base/item [item : base/item child : xml/xml] (let : base/item [tag : string := (:tag child)] (switch : base/item tag (case "" item) (case (list "reference" "summary" "titles") (copy item tag (xml/string-first<-xml child))) (else (copy item (msg<-error :invalidtagfound (anymap :type base/item :tag tag)))))) :doc "Returns a modified item based on a given child xml.") (func item<-xml : base/item [xml : xml/xml] (let : base/item [propmap : stringmap := (:propmap xml) item : base/item := (item<-item-stringmap (empty base/item) propmap)] (any<-list-start-reduce : base/item (:children xml) item item<-item-xmlchild)) :doc "Returns a item from a given xml.") (func location<-location-key-value : base/location [current : base/location key : string value : string] (switch : base/location key (case "" current) (case (list "name" "image") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/location :prop key :value value))))) :doc "Returns a modified location from a key value.") (func location<-location-stringmap : base/location [location : base/location propmap : stringmap] (any<-map-start-reduce : base/location propmap location location<-location-key-value) :doc "Returns a location from a propmap.") (func location<-location-xmlchild : base/location [location : base/location child : xml/xml] (let : base/location [tag : string := (:tag child)] (switch : base/location tag (case "" location) (case (list "reference" "summary" "titles") (copy location tag (xml/string-first<-xml child))) (else (copy location (msg<-error :invalidtagfound (anymap :type base/location :tag tag)))))) :doc "Returns a modified location based on a given child Xml.") (func location<-xml : base/location [xml : xml/xml] (let : base/location [propmap : stringmap := (:propmap xml) location : base/location := (location<-location-stringmap (empty base/location) propmap)] (any<-list-start-reduce : base/location (:children xml) location location<-location-xmlchild)) :doc "Returns a location from a given xml.") (func modifier<-xml : base/modifier) (func power<-power-key-value : base/power [current : base/power key : string value : string] (switch : base/power key (case "" current) (case (list "name" "image" "stat") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/power :prop key :value value))))) :doc "Returns a modified power from a key value.") (func power<-power-stringmap : base/power [power : base/power propmap : stringmap] (any<-map-start-reduce : base/power propmap power power<-power-key-value) :test (test (base/power :name "name" :image "image") (power<-power-stringmap (empty base/power) (stringmap :name "name" :image "image"))) :doc "Returns a new power from a propmap.") (func power<-power-xmlchild : base/power [power : base/power child : xml/xml] (let : base/power [tag : string := (:tag child)] (switch : base/power tag (case "" power) (case (list "reference" "summary" "titles") (copy power tag (xml/string-first<-xml child))) (case "ability" (power<-power-xmlability power child)) (case "specialty" (power<-power-xmlspecialty power child)) (else (copy power (msg<-error :invalidtagfound (anymap :type base/power :tag tag)))))) :test (test (base/power :titles "titles") (power<-power-xmlchild (empty base/power) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified power based on a given child xml.") (func power<-xml : base/power [xml : xml/xml] (let : base/power [propmap : stringmap := (:propmap xml) children : xmllist := (:children xml) power : base/power := (power<-power-stringmap (empty base/power) propmap)] (any<-list-start-reduce : base/power children power power<-power-xmlchild)) :test (test (base/power :name "name" :image "image" :titles "titles" :reference "reference" :abilitymap (base/abilitymap :ability1 (base/ability :name "ability1")) :specialtymap (base/specialtymap :specialty1 (base/specialty :name "specialty1"))) (power<-xml (xml/xml :tag "power" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))) (xml/xml :tag "ability" :propmap (stringmap :name "ability1")) (xml/xml :tag "specialty" :propmap (stringmap :name "specialty1")))))) :doc "Returns a power from a given Xml.") (func power<-power-xmlability : base/power [power : base/power xmlability : xml/xml] (let : base/power [ability : base/ability := (ability<-xml xmlability) name : string := (:name ability) origmap : base/abilitymap := (:abilitymap power) chgmap : base/abilitymap := (copy origmap name ability)] (copy power :abilitymap chgmap)) :doc "Return a power with new ability added to abilitymap") (func power<-power-xmlspecialty : base/power [power : base/power xmlspecialty : xml/xml] (let : base/power [specialty : base/specialty := (specialty<-xml xmlspecialty) name : string := (:name specialty) origmap : base/specialtymap := (:specialtymap power) chgmap : base/specialtymap := (copy origmap name specialty)] (copy power :specialtymap chgmap)) :doc "Return a power with new specialty added to specialtymap") (func rule<-rule-key-value : base/rule [current : base/rule key : string value : string] (switch : base/rule key (case "" current) (case (list "name" "image" "classification") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/rule :prop key :value value))))) :doc "Returns a modified rule from a key value.") (func rule<-rule-stringmap : base/rule [rule : base/rule propmap : stringmap] (any<-map-start-reduce : base/rule propmap rule rule<-rule-key-value) :test (test (base/rule :name "name" :image "image") (rule<-rule-stringmap (empty base/rule) (stringmap :name "name" :image "image"))) :doc "Returns a rule from a propmap.") (func rule<-rule-xmlchild : base/rule [rule : base/rule child : xml/xml] (let : base/rule [tag : string := (:tag child)] (switch : base/rule tag (case "" rule) (case (list "reference" "summary" "titles" "classification") (copy rule tag (xml/string-first<-xml child))) (else (copy rule (msg<-error :invalidtagfound (anymap :type base/rule :tag tag)))))) :test (test (base/rule :titles "titles") (rule<-rule-xmlchild (empty base/rule) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified rule based on a given child Xml.") (func rule<-xml : base/rule [xml : xml/xml] (let : base/rule [propmap : stringmap := (:propmap xml) rule : base/rule := (rule<-rule-stringmap (empty base/rule) propmap)] (any<-list-start-reduce : base/rule (:children xml) rule rule<-rule-xmlchild)) :doc "Returns a rule from a given xml.") (func scenario<-scenario-key-value : base/scenario [current : base/scenario key : string value : string] (switch : base/scenario key (case "" current) (case (list "name" "image") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/scenario :prop key :value value))))) :doc "Returns a modified scenario from a key value.") (func scenario<-scenario-stringmap : base/scenario [scenario : base/scenario propmap : stringmap] (any<-map-start-reduce : base/scenario propmap scenario scenario<-scenario-key-value) :doc "Returns a scenario from a propmap.") (func scenario<-scenario-xmlchild : base/scenario [scenario : base/scenario child : xml/xml] (let : base/scenario [tag : string := (:tag child)] (switch : base/scenario tag (case "" scenario) (case (list "reference" "summary" "titles") (copy scenario tag (xml/string-first<-xml child))) (else (copy scenario (msg<-error :invalidtagfound (anymap :type base/scenario :tag tag)))))) :doc "Returns a modified scenario based on a given child Xml.") (func scenario<-xml : base/scenario [xml : xml/xml] (let : base/scenario [propmap : stringmap := (:propmap xml) scen : base/scenario := (scenario<-scenario-stringmap (empty base/scenario) propmap)] (any<-list-start-reduce : base/scenario (:children xml) scen scenario<-scenario-xmlchild)) :test (test (base/scenario :name "name" :image "image" :titles "titles" :reference "reference") (scenario<-xml (xml/xml :tag "scenario" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))))))) :doc "Returns a scenario from a given xml.") (func section<-section-key-value : base/section [current : base/section key : string value : string] (switch : base/section key (case "" current) (case (list "name" "image") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/section :prop key :value value))))) :doc "Returns a modified section from a key value.") (func section<-section-stringmap : base/section [section : base/section propmap : stringmap] (any<-map-start-reduce : base/section propmap section section<-section-key-value) :doc "Returns a new book from a propmap.") (func section<-section-xmlchild : base/section [section : base/section child : xml/xml] (let : base/section [tag : string := (:tag child)] (switch : base/section tag (case "" section) (case (list "reference" "summary" "titles") (copy section tag (xml/string-first<-xml child))) (case "damage" (section<-section-xmldamage section child)) (case "item" (section<-section-xmlitem section child)) (case "place" (section<-section-xmllocation section child)) (case "power" (section<-section-xmlpower section child)) (case "rule" (section<-section-xmlrule section child)) (case "scenario" (section<-section-xmlscenario section child)) (case "section" (section<-section-xmlsection section child)) (case "skill" (section<-section-xmlskill section child)) (case "terrain" (section<-section-xmlterrain section child)) (case "unit" (section<-section-xmlunit section child)) (else (copy section (msg<-error :invalidtagfound (anymap :type base/section :tag tag)))))) :doc "Returns a modified section based on a given child Xml.") (func section<-section-xmldamage : base/section [section : base/section xmldamage : xml/xml] (let : base/section [current : base/damage := (damage<-xml xmldamage) name : string := (:name current) origmap : base/damagemap := (:damagemap section) chgmap : base/damagemap := (copy origmap name current)] (copy section :damagemap chgmap)) :doc "Return a section with new damage added to damagemap") (func section<-section-xmlitem : base/section [section : base/section xmlitem : xml/xml] (let : base/section [item : base/item := (item<-xml xmlitem) name : string := (:name item) origmap : base/itemmap := (:itemmap section) chgmap : base/itemmap := (copy origmap name item)] (copy section :itemmap chgmap)) :doc "Return a section with new item added to itemmap") (func section<-section-xmllocation : base/section [section : base/section xmllocation : xml/xml] (let : base/section [location : base/location := (location<-xml xmllocation) name : string := (:name location) origmap : base/locationmap := (:locationmap section) chgmap : base/locationmap := (copy origmap name location)] (copy section :locationmap chgmap)) :doc "Return a section with new location added to locationmap") (func section<-section-xmlpower : base/section [section : base/section xmlpower : xml/xml] (let : base/section [power : base/power := (power<-xml xmlpower) name : string := (:name power) origmap : base/powermap := (:powermap section) chgmap : base/powermap := (copy origmap name power)] (copy section :powermap chgmap)) :doc "Return a section with new power added to powermap") (func section<-section-xmlrule : base/section [section : base/section xmlrule : xml/xml] (let : base/section [rule : base/rule := (rule<-xml xmlrule) name : string := (:name rule) rulemap : base/rulemap := (:rulemap section) chgmap : base/rulemap := (copy rulemap name rule)] (copy section :rulemap chgmap)) :doc "Return a section with new rule added to rulemap") (func section<-section-xmlscenario : base/section [section : base/section xmlscenario : xml/xml] (let : base/section [scenario : base/scenario := (scenario<-xml xmlscenario) name : string := (:name scenario) scenariomap : base/scenariomap := (:scenariomap section) chgmap : base/scenariomap := (copy scenariomap name scenario)] (copy section :scenariomap chgmap)) :doc "Return a section with new scenario added to scenariomap") (func section<-section-xmlsection : base/section [section : base/section xmlsection : xml/xml] (let : base/section [subsect : base/section := (section<-xml xmlsection) name : string := (:name subsect) sectionmap : base/sectionmap := (:sectionmap section) chgmap : base/sectionmap := (copy sectionmap name subsect)] (copy section :sectionmap chgmap)) :doc "Return a section with new section added to sectionmap") (func section<-section-xmlskill : base/section [section : base/section xmlskill : xml/xml] (let : base/section [skill : base/skill := (skill<-xml xmlskill) name : string := (:name skill) origmap : base/skillmap := (:skillmap section) chgmap : base/skillmap := (copy origmap name skill)] (copy section :skillmap chgmap)) :doc "Return a section with new skill added to skillmap") (func section<-section-xmlterrain : base/section [section : base/section xmlterrain : xml/xml] (let : base/section [current : base/terrain := (terrain<-xml xmlterrain) name : string := (:name current) origmap : base/terrainmap := (:terrainmap section) chgmap : base/terrainmap := (copy origmap name current)] (copy section :terrainmap chgmap)) :doc "Return a section with new terrain added to terrainmap") (func section<-section-xmlunit : base/section [section : base/section xmlunit : xml/xml] (let : base/section [unit : base/unit := (unit<-xml xmlunit) name : string := (:name unit) unitmap : base/unitmap := (:unitmap section) chgmap : base/unitmap := (copy unitmap name unit)] (copy section :unitmap chgmap)) :doc "Return a section with new unit added to unitmap") (func section<-xml : base/section [xml : xml/xml] (let : base/section [propmap : stringmap := (:propmap xml) children : xml/xmllist := (:children xml) section : base/section := (section<-section-stringmap (empty base/section) propmap)] (any<-list-start-reduce : base/section children section section<-section-xmlchild)) :test (test (base/section :name "name" :image "image" :titles "titles" :reference "reference" :powermap (base/powermap :power1 (base/power :name "power1")) :scenariomap (base/scenariomap :scenario1 (base/scenario :name "scenario1")) :sectionmap (base/sectionmap :section1 (base/section :name "section1")) :skillmap (base/skillmap :skill1 (base/skill :name "skill1"))) (section<-xml (xml/xml :tag "section" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))) (xml/xml :tag "power" :propmap (stringmap :name "power1")) (xml/xml :tag "scenario" :propmap (stringmap :name "scenario1")) (xml/xml :tag "section" :propmap (stringmap :name "section1")) (xml/xml :tag "skill" :propmap (stringmap :name "skill1")))))) :doc "Returns a section from a given Xml.") (func skill<-skill-key-value : base/skill [current : base/skill key : string value : string] (switch : base/skill key (case "" current) (case (list "name" "image" "stat") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/skill :prop key :value value))))) :doc "Returns a modified skill from a key value.") (func skill<-skill-stringmap : base/skill [skill : base/skill propmap : stringmap] (any<-map-start-reduce : base/skill propmap skill skill<-skill-key-value) :doc "Returns a new skill from a propmap.") (func skill<-skill-xmlchild : base/skill [skill : base/skill child : xml/xml] (let : base/skill [tag : string := (:tag child)] (switch : base/skill tag (case "" skill) (case (list "reference" "summary" "titles") (copy skill tag (xml/string-first<-xml child))) (case "ability" (skill<-skill-xmlability skill child)) (case "specialty" (skill<-skill-xmlspecialty skill child)) (else (copy skill (msg<-error :invalidtagfound (anymap :type base/skill :tag tag)))))) :test (test (base/skill :titles "titles") (skill<-skill-xmlchild (empty base/skill) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified skill based on a given child Xml.") (func skill<-skill-xmlability : base/skill [skill : base/skill xmlability : xml/xml] (let : base/skill [ability : base/ability := (ability<-xml xmlability) name : string := (:name ability) origmap : base/abilitymap := (:abilitymap skill) chgmap : base/abilitymap := (copy origmap name ability)] (copy skill :abilitymap chgmap)) :doc "Return a skill with new ability added to abilitymap") (func skill<-skill-xmlspecialty : base/skill [skill : base/skill xmlspecialty : xml/xml] (let : base/skill [specialty : base/specialty := (specialty<-xml xmlspecialty) name : string := (:name specialty) origmap : base/specialtymap := (:specialtymap skill) chgmap : base/specialtymap := (copy origmap name specialty)] (copy skill :specialtymap chgmap)) :doc "Return a skill with new specialty added to specialtymap") (func skill<-xml : base/skill [xml : xml/xml] (let : base/skill [propmap : stringmap := (:propmap xml) skill : base/skill := (skill<-skill-stringmap (empty base/skill) propmap)] (any<-list-start-reduce : base/skill (:children xml) skill skill<-skill-xmlchild)) :test (test (base/skill :name "name" :image "image" :titles "titles" :reference "reference" :abilitymap (base/abilitymap :ability1 (base/ability :name "ability1")) :specialtymap (base/specialtymap :specialty1 (base/specialty :name "specialty1"))) (skill<-xml (xml/xml :tag "skill" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))) (xml/xml :tag "ability" :propmap (stringmap :name "ability1")) (xml/xml :tag "specialty" :propmap (stringmap :name "specialty1")))))) :doc "Returns a skill from a given xml.") (func specialty<-specialty-key-value : base/specialty [current : base/specialty key : string value : string] (switch : base/specialty key (case "" current) (case (list "name" "image") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/specialty :prop key :value value))))) :doc "Returns a modified specialty from a key value.") (func specialty<-specialty-stringmap : base/specialty [specialty : base/specialty propmap : stringmap] (any<-map-start-reduce : base/specialty propmap specialty specialty<-specialty-key-value) :test (test (base/specialty :name "name" :image "image") (specialty<-specialty-stringmap (empty base/specialty) (stringmap :name "name" :image "image"))) :doc "Returns a new specialty from a propmap.") (func specialty<-specialty-xmlchild : base/specialty [specialty : base/specialty child : xml/xml] (let : base/specialty [tag : string := (:tag child)] (switch : base/specialty tag (case "" specialty) (case (list "reference" "summary" "titles") (copy specialty tag (xml/string-first<-xml child))) (else (copy specialty (msg<-error :invalidtagfound (anymap :type base/specialty :tag tag)))))) :test (test (base/specialty :titles "titles") (specialty<-specialty-xmlchild (empty base/specialty) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified specialty based on a given child xml.") (func specialty<-xml : base/specialty [xml : xml/xml] (let : base/specialty [propmap : stringmap := (:propmap xml) spc : base/specialty := (specialty<-specialty-stringmap (empty base/specialty) propmap)] (any<-list-start-reduce : base/specialty (:children xml) spc specialty<-specialty-xmlchild)) :test (test (base/specialty :name "name" :image "image" :titles "titles" :reference "reference") (specialty<-xml (xml/xml :tag "specialty" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))))))) :doc "Returns a specialty from a given xml.") (func string-read<-bookname : string [bookname : string] (string-read<-file (file-read<-bookname bookname)) :context :doc "Returns text from a file with bookname.") (func string-vxlisp<-book : string [book : base/book] (let : string [name : string := (bl/string-writename<-book book) text : string := (string<-any-indent book 1 false)] (string "(package nx/tactics/books/" name "\n :libs (lib base :path nx/tactics/base))\n\n(func tacticsbook : base/book\n " text ")\n")) :doc "Returns a vxlisp string from a book.") (func string-writename<-book : string [book : base/book] (let : string [name : string := (:name book) lower : string := (typ/string-lowercase name) space : string := (string<-string-find-replace lower " " "_") comma : string := (string<-string-find-replace space "," "")] comma) :doc "Returns the write filename from a book") (func terrain<-terrain-key-value : base/terrain [current : base/terrain key : string value : string] (switch : base/terrain key (case "" current) (case (list "name" "image") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/terrain :prop key :value value))))) :doc "Returns a modified terrain from a key value.") (func terrain<-terrain-stringmap : base/terrain [terrain : base/terrain propmap : stringmap] (any<-map-start-reduce : base/terrain propmap terrain terrain<-terrain-key-value) :test (test (base/terrain :name "name" :image "image") (terrain<-terrain-stringmap (empty base/terrain) (stringmap :name "name" :image "image"))) :doc "Returns a terrain from a propmap.") (func terrain<-terrain-xmlchild : base/terrain [terrain : base/terrain child : xml/xml] (let : base/terrain [tag : string := (:tag child)] (switch : base/terrain tag (case "" terrain) (case (list "reference" "summary" "titles" "classification") (copy terrain tag (xml/string-first<-xml child))) (else (copy terrain (msg<-error :invalidtagfound (anymap :type base/terrain :tag tag)))))) :test (test (base/terrain :titles "titles") (terrain<-terrain-xmlchild (empty base/terrain) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified terrain based on a given child Xml.") (func terrain<-xml : base/terrain [xml : xml/xml] (let : base/terrain [propmap : stringmap := (:propmap xml) terrain : base/terrain := (terrain<-terrain-stringmap (empty base/terrain) propmap)] (any<-list-start-reduce : base/terrain (:children xml) terrain terrain<-terrain-xmlchild)) :doc "Returns a terrain from a given xml.") (func unit<-unit-key-value : base/unit [current : base/unit key : string value : string] (switch : base/unit key (case "" current) (case (list "name" "image" "classification" "crew" "body" "height" "length" "mass" "mind" "speed" "width" "will") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/unit :prop key :value value))))) :doc "Returns a modified unit from a key value.") (func unit<-unit-stringmap : base/unit [unit : base/unit propmap : stringmap] (any<-map-start-reduce propmap unit unit<-unit-key-value) :test (test (base/unit :name "name" :image "image") (unit<-unit-stringmap (empty base/unit) (stringmap :name "name" :image "image"))) :doc "Returns a new unit from a propmap.") (func unit<-unit-xmlchild : base/unit [unit : base/unit child : xml/xml] (let : base/unit [tag : string := (:tag child)] (switch : base/unit tag (case "" unit) (case (list "reference" "summary" "titles") (copy unit tag (xml/string-first<-xml child))) (case "power" (unit<-unit-xmlpower unit child)) (case "skill" (unit<-unit-xmlskill unit child)) (case "weakness" (unit<-unit-xmlweakness unit child)) (else (copy unit (msg<-error :invalidtagfound (anymap :type base/unit :tag tag)))))) :test (test (base/unit :titles "titles") (unit<-unit-xmlchild (empty base/unit) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified unit based on a given child Xml.") (func unit<-unit-xmlpower : base/unit [unit : base/unit xmlpower : xml/xml] (let : base/unit [unitpower : base/unitpower := (unitpower<-xml xmlpower) name : string := (:name unitpower) unitpowermap : base/unitpowermap := (:unitpowermap unit) chgmap : base/unitpowermap := (copy unitpowermap name unitpower)] (copy unit :unitpowermap chgmap)) :doc "Return a unit with new unit added to unitpowermap") (func unit<-unit-xmlskill : base/unit [unit : base/unit xmlskill : xml/xml] (let : base/unit [unitskill : base/unitskill := (unitskill<-xml xmlskill) name : string := (:name unitskill) unitskillmap : base/unitskillmap := (:unitskillmap unit) chgmap : base/unitskillmap := (copy unitskillmap name unitskill)] (copy unit :unitskillmap chgmap)) :doc "Return a unit with new unitskill added to unitskillmap") (func unit<-unit-xmlweakness : base/unit [unit : base/unit xmlweakness : xml/xml] (let : base/unit [unitweakness : base/unitweakness := (unitweakness<-xml xmlweakness) name : string := (:name unitweakness) unitweaknessmap : base/unitweaknessmap := (:unitweaknessmap unit) chgmap : base/unitweaknessmap := (copy unitweaknessmap name unitweakness)] (copy unit :unitweaknessmap chgmap)) :doc "Return a unit with new unitweakness added to unitweaknessmap") (func unit<-xml : base/unit [xml : xml/xml] (let : base/unit [propmap : stringmap := (:propmap xml) unt : base/unit := (unit<-unit-stringmap (empty base/unit) propmap)] (any<-list-start-reduce : base/unit (:children xml) unt unit<-unit-xmlchild)) :test (test (base/unit :name "name" :image "image" :titles "titles" :reference "reference" :unitskillmap (base/unitskillmap "skill1" (base/unitskill :name "skill1"))) (unit<-xml (xml/xml :tag "unit" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))) (xml/xml :tag "skill" :propmap (stringmap :name "skill1")))))) :doc "Returns a unit from a given xml.") (func unitability<-unitability-key-value : base/unitability [current : base/unitability key : string value : string] (switch : base/unitability key (case "" current) (case (list "name" "image") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/unitability :prop key :value value))))) :doc "Returns a modified unitability from a key value.") (func unitability<-unitability-stringmap : base/unitability [unitability : base/unitability propmap : stringmap] (any<-map-start-reduce : base/unitability propmap unitability unitability<-unitability-key-value) :test (test (base/unitability :name "name" :image "image") (unitability<-unitability-stringmap (empty base/unitability) (stringmap :name "name" :image "image"))) :doc "Returns a new unitability from a propmap.") (func unitability<-unitability-xmlchild : base/unitability [unitability : base/unitability child : xml/xml] (let : base/unitability [tag : string := (:tag child)] (switch : base/unitability tag (case "" unitability) (case (list "reference" "summary" "titles") (copy unitability tag (xml/string-first<-xml child))) (else (copy unitability (msg<-error :invalidtagfound (anymap :type base/unitability :tag tag)))))) :test (test (base/unitability :titles "titles") (unitability<-unitability-xmlchild (empty base/unitability) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified unitability based on a given child xml.") (func unitability<-xml : base/unitability [xml : xml/xml] (let : base/unitability [propmap : stringmap := (:propmap xml) unitability : base/unitability := (unitability<-unitability-stringmap (empty base/unitability) propmap)] (any<-list-start-reduce : base/unitability (:children xml) unitability unitability<-unitability-xmlchild)) :test (test (base/unitability :name "name" :image "image" :titles "titles" :reference "reference") (unitability<-xml (xml/xml :tag "unitability" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))))))) :doc "Returns a unitability from a given xml.") (func unititem<-unititem-key-value : base/unititem [current : base/unititem key : string value : string] (switch : base/unititem key (case "" current) (case (list "name" "image" "modifiers" "number") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/unititem :prop key :value value))))) :doc "Returns a modified unititem from a key value.") (func unititem<-unititem-stringmap : base/unititem [unititem : base/unititem propmap : stringmap] (any<-map-start-reduce : base/unititem propmap unititem unititem<-unititem-key-value) :test (test (base/unititem :name "name" :image "image") (unititem<-unititem-stringmap (empty base/unititem) (stringmap :name "name" :image "image"))) :doc "Returns a new unititem from a propmap.") (func unititem<-unititem-xmlchild : base/unititem [unititem : base/unititem child : xml/xml] (let : base/unititem [tag : string := (:tag child)] (switch : base/unititem tag (case "" unititem) (case (list "reference" "summary" "titles") (copy unititem tag (xml/string-first<-xml child))) (else (copy unititem (msg<-error :invalidtagfound (anymap :type base/unititem :tag tag)))))) :test (test (base/unititem :titles "titles1") (unititem<-unititem-xmlchild (empty base/unititem) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles1"))))) :doc "Returns a modified unititem based on a given child xml.") (func unititem<-xml : base/unititem [xml : xml/xml] (let : base/unititem [propmap : stringmap := (:propmap xml) children : xml/xmllist := (:children xml) unititem : base/unititem := (unititem<-unititem-stringmap (empty base/unititem) propmap)] (any<-list-start-reduce : base/unititem children unititem unititem<-unititem-xmlchild)) :test (test (base/unititem :name "name1" :image "image1" :titles "titles1" :reference "reference1" :summary "summary1") (unititem<-xml (xml/xml :tag "unititem" :propmap (stringmap :name "name1" :image "image1") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles1"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference1"))) (xml/xml :tag "summary" :children (xml/xmllist (xml/xml :text "summary1"))))))) :doc "Returns a unititem from a given xml.") (func unitpower<-unitpower-key-value : base/unitpower [current : base/unitpower key : string value : string] (switch : base/unitpower key (case "" current) (case (list "name" "image" "back" "bottom" "front" "level" "over" "side" "strength" "under") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/unitpower :prop key :value value))))) :doc "Returns a modified unitpower from a key value.") (func unitpower<-unitpower-stringmap : base/unitpower [unitpower : base/unitpower propmap : stringmap] (any<-map-start-reduce propmap unitpower unitpower<-unitpower-key-value) :doc "Returns a new unitpower from a propmap.") (func unitpower<-unitpower-xmlability : base/unitpower [unitpower : base/unitpower xmlability : xml/xml] (let : base/unitpower [ability : base/unitability := (unitability<-xml xmlability) name : string := (:name ability) origmap : base/unitabilitymap := (:unitabilitymap unitpower) chgmap : base/unitabilitymap := (copy origmap name ability)] (copy unitpower :unitabilitymap chgmap)) :doc "") (func unitpower<-unitpower-xmlchild : base/unitpower [unitpower : base/unitpower child : xml/xml] (let : base/unitpower [tag : string := (:tag child)] (switch : base/unitpower tag (case "" unitpower) (case (list "reference" "summary" "titles") (copy unitpower tag (xml/string-first<-xml child))) (case "ability" (unitpower<-unitpower-xmlability unitpower child)) (case "item" (unitpower<-unitpower-xmlitem unitpower child)) (case "specialty" (unitpower<-unitpower-xmlspecialty unitpower child)) (else (copy unitpower (msg<-error :invalidtagfound (anymap :type base/unitpower :tag tag)))))) :test (test (base/unitpower :summary "summary1") (unitpower<-unitpower-xmlchild (empty base/unitpower) (xml/xml :tag "summary" :children (xml/xmllist (xml/xml :text "summary1"))))) :doc "") (func unitpower<-unitpower-xmlitem : base/unitpower [unitpower : base/unitpower xmlitem : xml/xml] (let : base/unitpower [item : base/unititem := (unititem<-xml xmlitem) name : string := (:name item) origmap : base/unititemmap := (:unititemmap unitpower) chgmap : base/unititemmap := (copy origmap name item)] (copy unitpower :unititemmap chgmap)) :doc "") (func unitpower<-unitpower-xmlspecialty : base/unitpower [unitpower : base/unitpower xmlspecialty : xml/xml] (let : base/unitpower [specialty : base/unitspecialty := (unitspecialty<-xml xmlspecialty) name : string := (:name specialty) origmap : base/unitspecialtymap := (:unitspecialtymap unitpower) chgmap : base/unitspecialtymap := (copy origmap name specialty)] (copy unitpower :unitspecialtymap chgmap)) :doc "") (func unitpower<-xml : base/unitpower [xml : xml/xml] (let : base/unitpower [propmap : stringmap := (:propmap xml) unitpower : base/unitpower := (unitpower<-unitpower-stringmap (empty base/unitpower) propmap)] (any<-list-start-reduce : base/unitpower (:children xml) unitpower unitpower<-unitpower-xmlchild)) :doc "") (func unitskill<-unitskill-key-value : base/unitskill [current : base/unitskill key : string value : string] (switch : base/unitskill key (case "" current) (case (list "name" "image" "back" "bottom" "front" "level" "side" "top") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/unitskill :prop key :value value))))) :doc "Returns a modified unitskill from a key value.") (func unitskill<-unitskill-stringmap : base/unitskill [unitskill : base/unitskill propmap : stringmap] (any<-map-start-reduce propmap unitskill unitskill<-unitskill-key-value) :doc "Returns a new unitskill from a propmap.") (func unitskill<-unitskill-xmlability : base/unitskill [unitskill : base/unitskill xmlability : xml/xml] (let : base/unitskill [ability : base/unitability := (unitability<-xml xmlability) name : string := (:name ability) origmap : base/unitabilitymap := (:unitabilitymap unitskill) chgmap : base/unitabilitymap := (copy origmap name ability)] (copy unitskill :unitabilitymap chgmap)) :doc "") (func unitskill<-unitskill-xmlchild : base/unitskill [unitskill : base/unitskill child : xml/xml] (let : base/unitskill [tag : string := (:tag child)] (switch : base/unitskill tag (case "" unitskill) (case (list "reference" "summary" "titles") (copy unitskill tag (xml/string-first<-xml child))) (case "ability" (unitskill<-unitskill-xmlability unitskill child)) (case "item" (unitskill<-unitskill-xmlitem unitskill child)) (case "specialty" (unitskill<-unitskill-xmlspecialty unitskill child)) (else (copy unitskill (msg<-error :invalidtagfound (anymap :type base/unitskill :tag tag)))))) :test (test (base/unitskill :summary "summary1") (unitskill<-unitskill-xmlchild (empty base/unitskill) (xml/xml :tag "summary" :children (xml/xmllist (xml/xml :text "summary1"))))) :doc "") (func unitskill<-unitskill-xmlitem : base/unitskill [unitskill : base/unitskill xmlitem : xml/xml] (let : base/unitskill [item : base/unititem := (unititem<-xml xmlitem) name : string := (:name item) origmap : base/unititemmap := (:unititemmap unitskill) chgmap : base/unititemmap := (copy origmap name item)] (copy unitskill :unititemmap chgmap)) :doc "") (func unitskill<-unitskill-xmlspecialty : base/unitskill [unitskill : base/unitskill xmlspecialty : xml/xml] (let : base/unitskill [specialty : base/unitspecialty := (unitspecialty<-xml xmlspecialty) name : string := (:name specialty) origmap : base/unitspecialtymap := (:unitspecialtymap unitskill) chgmap : base/unitspecialtymap := (copy origmap name specialty)] (copy unitskill :unitspecialtymap chgmap)) :doc "") (func unitskill<-xml : base/unitskill [xml : xml/xml] (let : base/unitskill [propmap : stringmap := (:propmap xml) unitskill : base/unitskill := (unitskill<-unitskill-stringmap (empty base/unitskill) propmap)] (any<-list-start-reduce : base/unitskill (:children xml) unitskill unitskill<-unitskill-xmlchild)) :doc "") (func unitspecialty<-unitspecialty-key-value : base/unitspecialty [current : base/unitspecialty key : string value : string] (switch : base/unitspecialty key (case "" current) (case (list "name" "image") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/unitspecialty :prop key :value value))))) :doc "Returns a modified unitspecialty from a key value.") (func unitspecialty<-unitspecialty-stringmap : base/unitspecialty [unitspecialty : base/unitspecialty propmap : stringmap] (any<-map-start-reduce : base/unitspecialty propmap unitspecialty unitspecialty<-unitspecialty-key-value) :test (test (base/unitspecialty :name "name" :image "image") (unitspecialty<-unitspecialty-stringmap (empty base/unitspecialty) (stringmap :name "name" :image "image"))) :doc "Returns a new unitspecialty from a propmap.") (func unitspecialty<-unitspecialty-xmlchild : base/unitspecialty [unitspecialty : base/unitspecialty child : xml/xml] (let : base/unitspecialty [tag : string := (:tag child)] (switch : base/unitspecialty tag (case "" unitspecialty) (case (list "reference" "summary" "titles") (copy unitspecialty tag (xml/string-first<-xml child))) (else (copy unitspecialty (msg<-error :invalidtagfound (anymap :type base/unitspecialty :tag tag)))))) :test (test (base/unitspecialty :titles "titles") (unitspecialty<-unitspecialty-xmlchild (empty base/unitspecialty) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified unitspecialty based on a given child xml.") (func unitspecialty<-xml : base/unitspecialty [xml : xml/xml] (let : base/unitspecialty [propmap : stringmap := (:propmap xml) unitspecialty : base/unitspecialty := (unitspecialty<-unitspecialty-stringmap (empty base/unitspecialty) propmap)] (any<-list-start-reduce : base/unitspecialty (:children xml) unitspecialty unitspecialty<-unitspecialty-xmlchild)) :test (test (base/unitspecialty :name "name" :image "image" :titles "titles" :reference "reference") (unitspecialty<-xml (xml/xml :tag "unitspecialty" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))))))) :doc "Returns a unitspecialty from a given xml.") (func unitweakness<-xml : base/unitweakness [xml : xml/xml]) (func weakness<-xml : base/weakness [xml : xml/xml]) (func xml-read<-bookname : xml/xml [bookname : string] (xml/xml-read<-file (file-read<-bookname bookname)) :context :doc "Returns an xml from a file with bookname.")
nx/tactics/books/bookloader / ability<-ability-key-value
Description:
  • Returns a modified ability from a key value.
Function Name:
  • ability<-ability-key-value
Return Type:
  • nx/tactics/base/ability
Arguments:
  • Name
    Type
    Generic
    Description
    current
    nx/tactics/base/ability
    key
    vx/core/string
    value
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func ability<-ability-key-value : base/ability [current : base/ability key : string value : string] (switch : base/ability key (case "" current) (case (list "name" "image") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/ability :prop key :value value))))) :doc "Returns a modified ability from a key value.")
nx/tactics/books/bookloader / ability<-ability-stringmap
Description:
  • Returns a new ability from a propmap.
Function Name:
  • ability<-ability-stringmap
Return Type:
  • nx/tactics/base/ability
Arguments:
  • Name
    Type
    Generic
    Description
    ability
    nx/tactics/base/ability
    propmap
    vx/core/stringmap
Usage/Test Cases:
  • (test (base/ability :name "name" :image "image") (ability<-ability-stringmap (empty base/ability) (stringmap :name "name" :image "image")))
Source Code:
  • (func ability<-ability-stringmap : base/ability [ability : base/ability propmap : stringmap] (any<-map-start-reduce : base/ability propmap ability ability<-ability-key-value) :test (test (base/ability :name "name" :image "image") (ability<-ability-stringmap (empty base/ability) (stringmap :name "name" :image "image"))) :doc "Returns a new ability from a propmap.")
nx/tactics/books/bookloader / ability<-ability-xmlchild
Description:
  • Returns a modified ability based on a given child xml.
Function Name:
  • ability<-ability-xmlchild
Return Type:
  • nx/tactics/base/ability
Arguments:
  • Name
    Type
    Generic
    Description
    ability
    nx/tactics/base/ability
    child
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/ability :titles "titles") (ability<-ability-xmlchild (empty base/ability) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles")))))
Source Code:
  • (func ability<-ability-xmlchild : base/ability [ability : base/ability child : xml/xml] (let : base/ability [tag : string := (:tag child)] (switch : base/ability tag (case "" ability) (case (list "reference" "summary" "titles") (copy ability tag (xml/string-first<-xml child))) (else (copy ability (msg<-error :invalidtagfound (anymap :type base/ability :tag tag)))))) :test (test (base/ability :titles "titles") (ability<-ability-xmlchild (empty base/ability) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified ability based on a given child xml.")
nx/tactics/books/bookloader / ability<-xml
Description:
  • Returns a ability from a given xml.
Function Name:
  • ability<-xml
Return Type:
  • nx/tactics/base/ability
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/ability :name "name" :image "image" :titles "titles" :reference "reference") (ability<-xml (xml/xml :tag "ability" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference")))))))
Source Code:
  • (func ability<-xml : base/ability [xml : xml/xml] (let : base/ability [propmap : stringmap := (:propmap xml) ability : base/ability := (ability<-ability-stringmap (empty base/ability) propmap)] (any<-list-start-reduce : base/ability (:children xml) ability ability<-ability-xmlchild)) :test (test (base/ability :name "name" :image "image" :titles "titles" :reference "reference") (ability<-xml (xml/xml :tag "ability" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))))))) :doc "Returns a ability from a given xml.")
nx/tactics/books/bookloader / book<-book-key-value
Description:
  • Returns a modified book from a key value.
Function Name:
  • book<-book-key-value
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
    current
    nx/tactics/base/book
    key
    vx/core/string
    value
    vx/core/string
Usage/Test Cases:
  • (test (base/book :name "nm") (book<-book-key-value (empty base/book) "name" "nm"))
  • (test (base/book :name "image") (book<-book-key-value (empty base/book) "name" "image"))
Source Code:
  • (func book<-book-key-value : base/book [current : base/book key : string value : string] (switch : base/book key (case "" current) (case (list "name" "image") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/book :prop key :value value))))) :test (test (base/book :name "nm") (book<-book-key-value (empty base/book) "name" "nm")) (test (base/book :name "image") (book<-book-key-value (empty base/book) "name" "image")) :doc "Returns a modified book from a key value.")
nx/tactics/books/bookloader / book<-book-stringmap
Description:
  • Returns a new book from a propmap.
Function Name:
  • book<-book-stringmap
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
    book
    nx/tactics/base/book
    propmap
    vx/core/stringmap
Usage/Test Cases:
  • (test (base/book :name "name" :image "image") (book<-book-stringmap (empty base/book) (stringmap :name "name" :image "image")))
Source Code:
  • (func book<-book-stringmap : base/book [book : base/book propmap : stringmap] (any<-map-start-reduce : base/book propmap book book<-book-key-value) :test (test (base/book :name "name" :image "image") (book<-book-stringmap (empty base/book) (stringmap :name "name" :image "image"))) :doc "Returns a new book from a propmap.")
nx/tactics/books/bookloader / book<-book-xml
Description:
  • Returns an altered book based on xml child.
Function Name:
  • book<-book-xml
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
    current
    nx/tactics/base/book
    child
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/book :name "name1") (book<-book-xml (empty base/book) (xml/xml :tag "doc" :propmap (stringmap :name "name1"))))
  • (test (empty base/book) (book<-book-xml (empty base/book) (xml/xml :tag "?xml")))
  • (test (base/book :name "name1" (msgblock (msg :code ":duplicatetagfound" :detail (anymap :type nx/tactics/base/book :tag "doc") :severity 2))) (book<-book-xml (base/book :name "name1") (xml/xml :tag "doc")))
Source Code:
  • (func book<-book-xml : base/book [current : base/book child : xml/xml] (let : base/book [tag : string := (:tag child)] (switch : base/book tag (case "" current) (case "!--" current) (case "?xml" current) (case "doc" (if : base/book (then (is-empty current) (book<-xmldoc child)) (else (copy current (msg<-error :duplicatetagfound (anymap :type base/book :tag tag)))))) (else (copy current (msg<-error :invalidtagfound (anymap :type base/book :tag tag)))))) :test (test (base/book :name "name1") (book<-book-xml (empty base/book) (xml/xml :tag "doc" :propmap (stringmap :name "name1")))) (test (empty base/book) (book<-book-xml (empty base/book) (xml/xml :tag "?xml"))) (test (base/book :name "name1" (msgblock (msg :code ":duplicatetagfound" :detail (anymap :type nx/tactics/base/book :tag "doc") :severity 2))) (book<-book-xml (base/book :name "name1") (xml/xml :tag "doc"))) :doc "Returns an altered book based on xml child.")
nx/tactics/books/bookloader / book<-book-xmlchapter
Description:
  • Returns an altered book based on xmlchapter.
Function Name:
  • book<-book-xmlchapter
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
    book
    nx/tactics/base/book
    xml
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/book :chaptermap (base/chaptermap :chapter1 (base/chapter :name "chapter1"))) (book<-book-xmlchapter (empty base/book) (xml/xml :tag "chapter" :propmap (stringmap :name "chapter1"))))
Source Code:
  • (func book<-book-xmlchapter : base/book [book : base/book xml : xml/xml] (let : base/book [chapter : base/chapter := (chapter<-xml xml) name : string := (:name chapter) origmap : base/chaptermap := (:chaptermap book) chgmap : base/chaptermap := (copy origmap name chapter)] (copy book :chaptermap chgmap)) :test (test (base/book :chaptermap (base/chaptermap :chapter1 (base/chapter :name "chapter1"))) (book<-book-xmlchapter (empty base/book) (xml/xml :tag "chapter" :propmap (stringmap :name "chapter1")))) :doc "Returns an altered book based on xmlchapter.")
nx/tactics/books/bookloader / book<-book-xmlchild
Description:
  • Returns a modified book based on a given child xml.
Function Name:
  • book<-book-xmlchild
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
    book
    nx/tactics/base/book
    child
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/book :titles "titles") (book<-book-xmlchild (empty base/book) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles")))))
  • (test (base/book :chaptermap (base/chaptermap :chapter1 (base/chapter :name "chapter1"))) (book<-book-xmlchild (empty base/book) (xml/xml :tag "chapter" :propmap (stringmap :name "chapter1"))))
Source Code:
  • (func book<-book-xmlchild : base/book [book : base/book child : xml/xml] (let : base/book [tag : string := (:tag child)] (switch : base/book tag (case "" book) (case (list "reference" "summary" "titles") (copy book tag (xml/string-first<-xml child))) (case "chapter" (book<-book-xmlchapter book child)) (else (copy book (msg<-error :invalidtagfound (anymap :type base/book :tag tag)))))) :test (test (base/book :titles "titles") (book<-book-xmlchild (empty base/book) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) (test (base/book :chaptermap (base/chaptermap :chapter1 (base/chapter :name "chapter1"))) (book<-book-xmlchild (empty base/book) (xml/xml :tag "chapter" :propmap (stringmap :name "chapter1")))) :doc "Returns a modified book based on a given child xml.")
nx/tactics/books/bookloader / book<-xml
Description:
  • Returns a book from a given top level xml.
Function Name:
  • book<-xml
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/book :name "name1") (book<-xml (xml/xml :children (xml/xmllist (xml/xml :tag "?xml") (xml/xml :tag "doc" :propmap (stringmap :name "name1"))))))
Source Code:
  • (func book<-xml : base/book [xml : xml/xml] (book<-xmllist (:children xml)) :test (test (base/book :name "name1") (book<-xml (xml/xml :children (xml/xmllist (xml/xml :tag "?xml") (xml/xml :tag "doc" :propmap (stringmap :name "name1")))))) :doc "Returns a book from a given top level xml.")
nx/tactics/books/bookloader / book<-xmldoc
Description:
  • Returns a book from a given xml.
Function Name:
  • book<-xmldoc
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/book :name "name1" :image "image1" :titles "titles1" :reference "reference1" :chaptermap (base/chaptermap :chapter1 (base/chapter :name "chapter1"))) (book<-xmldoc (xml/xml :tag "doc" :propmap (stringmap :name "name1" :image "image1") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles1"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference1"))) (xml/xml :tag "chapter" :propmap (stringmap :name "chapter1"))))))
Source Code:
  • (func book<-xmldoc : base/book [xml : xml/xml] (let : base/book [propmap : stringmap := (:propmap xml) children : xmllist := (:children xml) book : base/book := (book<-book-stringmap (empty base/book) propmap)] (any<-list-start-reduce : base/book children book book<-book-xmlchild)) :test (test (base/book :name "name1" :image "image1" :titles "titles1" :reference "reference1" :chaptermap (base/chaptermap :chapter1 (base/chapter :name "chapter1"))) (book<-xmldoc (xml/xml :tag "doc" :propmap (stringmap :name "name1" :image "image1") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles1"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference1"))) (xml/xml :tag "chapter" :propmap (stringmap :name "chapter1")))))) :doc "Returns a book from a given xml.")
nx/tactics/books/bookloader / book<-xmllist
Description:
  • Returns a book from a given xml.
Function Name:
  • book<-xmllist
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
    xmllist
    vx/data/xml/xmllist
Usage/Test Cases:
  • (test (base/book :name "name1") (book<-xmllist (xml/xmllist (xml/xml :tag "?xml") (xml/xml :tag "doc" :propmap (stringmap :name "name1")))))
Source Code:
  • (func book<-xmllist : base/book [xmllist : xml/xmllist] (any<-list-start-reduce : base/book xmllist (empty base/book) book<-book-xml) :test (test (base/book :name "name1") (book<-xmllist (xml/xmllist (xml/xml :tag "?xml") (xml/xml :tag "doc" :propmap (stringmap :name "name1"))))) :doc "Returns a book from a given xml.")
nx/tactics/books/bookloader / boolean-write<-book
Description:
  • Returns boolean after writing book as a file.
Function Name:
  • boolean-write<-book
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    book
    nx/tactics/base/book
Usage/Test Cases:
Source Code:
  • (func boolean-write<-book : boolean [book : base/book] (let : boolean [text : string := (string-vxlisp<-book book) file : fil/file := (file-write<-book book)] (boolean-write<-file-string file text)) :context :doc "Returns boolean after writing book as a file.")
nx/tactics/books/bookloader / book-read<-bookname
Description:
  • Returns a book by loading the given Xml filename.
Function Name:
  • book-read<-bookname
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
    bookname
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func book-read<-bookname : base/book [bookname : string] (let : base/book [xml : xml/xml := (xml-read<-bookname bookname)] (book<-xml xml)) :context :doc "Returns a book by loading the given Xml filename.")
nx/tactics/books/bookloader / boolean-write<-booknames
Description:
  • Returns boolean after writing book as a file.
Function Name:
  • boolean-write<-booknames
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    booknames
    vx/core/stringlist
Usage/Test Cases:
Source Code:
  • (func boolean-write<-booknames : boolean [booknames : stringlist] (let : boolean [bools : booleanlist := (list<-list : booleanlist booknames (fn : boolean [bookname : string] (let : boolean [book : base/book := (book-read<-bookname bookname)] (boolean-write<-book book))))] (and bools)) :context :doc "Returns boolean after writing book as a file.")
nx/tactics/books/bookloader / chapter<-chapter-key-value
Description:
  • Returns a modified chapter from a key value.
Function Name:
  • chapter<-chapter-key-value
Return Type:
  • nx/tactics/base/chapter
Arguments:
  • Name
    Type
    Generic
    Description
    current
    nx/tactics/base/chapter
    key
    vx/core/string
    value
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func chapter<-chapter-key-value : base/chapter [current : base/chapter key : string value : string] (switch : base/chapter key (case "" current) (case (list "name" "image") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/chapter :prop key :value value))))) :doc "Returns a modified chapter from a key value.")
nx/tactics/books/bookloader / chapter<-chapter-stringmap
Description:
  • Returns a new book from a propmap.
Function Name:
  • chapter<-chapter-stringmap
Return Type:
  • nx/tactics/base/chapter
Arguments:
  • Name
    Type
    Generic
    Description
    chapter
    nx/tactics/base/chapter
    propmap
    vx/core/stringmap
Usage/Test Cases:
  • (test (base/chapter :name "name" :image "image") (chapter<-chapter-stringmap (empty base/chapter) (stringmap :name "name" :image "image")))
Source Code:
  • (func chapter<-chapter-stringmap : base/chapter [chapter : base/chapter propmap : stringmap] (any<-map-start-reduce : base/chapter propmap chapter chapter<-chapter-key-value) :test (test (base/chapter :name "name" :image "image") (chapter<-chapter-stringmap (empty base/chapter) (stringmap :name "name" :image "image"))) :doc "Returns a new book from a propmap.")
nx/tactics/books/bookloader / chapter<-chapter-xmlchild
Description:
  • Returns a modified chapter based on a given child Xml.
Function Name:
  • chapter<-chapter-xmlchild
Return Type:
  • nx/tactics/base/chapter
Arguments:
  • Name
    Type
    Generic
    Description
    chapter
    nx/tactics/base/chapter
    child
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/chapter :titles "titles") (chapter<-chapter-xmlchild (empty base/chapter) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles")))))
Source Code:
  • (func chapter<-chapter-xmlchild : base/chapter [chapter : base/chapter child : xml/xml] (let : base/chapter [tag : string := (:tag child)] (switch : base/chapter tag (case "" chapter) (case (list "reference" "summary" "titles") (copy chapter tag (xml/string-first<-xml child))) (case "section" (chapter<-chapter-xmlsection chapter child)) (else (copy chapter (msg<-error :invalidtagfound (anymap :type base/chapter :tag tag)))))) :test (test (base/chapter :titles "titles") (chapter<-chapter-xmlchild (empty base/chapter) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified chapter based on a given child Xml.")
nx/tactics/books/bookloader / chapter<-chapter-xmlsection
Description:
  • Return a chapter with new section added to sectionmap
Function Name:
  • chapter<-chapter-xmlsection
Return Type:
  • nx/tactics/base/chapter
Arguments:
  • Name
    Type
    Generic
    Description
    chapter
    nx/tactics/base/chapter
    xmlsection
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func chapter<-chapter-xmlsection : base/chapter [chapter : base/chapter xmlsection : xml/xml] (let : base/chapter [section : base/section := (section<-xml xmlsection) name : string := (:name section) sectionmap : base/sectionmap := (:sectionmap section) chgmap : base/sectionmap := (copy sectionmap name section)] (copy chapter :sectionmap chgmap)) :doc "Return a chapter with new section added to sectionmap")
nx/tactics/books/bookloader / chapter<-xml
Description:
  • Returns a chapter from a given Xml.
Function Name:
  • chapter<-xml
Return Type:
  • nx/tactics/base/chapter
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/chapter :name "name" :image "image" :titles "titles" :reference "reference" :sectionmap (base/sectionmap :section1 (base/section :name "section1"))) (chapter<-xml (xml/xml :tag "chapter" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))) (xml/xml :tag "section" :propmap (stringmap :name "section1"))))))
Source Code:
  • (func chapter<-xml : base/chapter [xml : xml/xml] (let : base/chapter [propmap : stringmap := (:propmap xml) chap : base/chapter := (chapter<-chapter-stringmap (empty base/chapter) propmap)] (any<-list-start-reduce : base/chapter (:children xml) chap chapter<-chapter-xmlchild)) :test (test (base/chapter :name "name" :image "image" :titles "titles" :reference "reference" :sectionmap (base/sectionmap :section1 (base/section :name "section1"))) (chapter<-xml (xml/xml :tag "chapter" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))) (xml/xml :tag "section" :propmap (stringmap :name "section1")))))) :doc "Returns a chapter from a given Xml.")
nx/tactics/books/bookloader / damage<-damage-key-value
Description:
  • Returns a modified damage from a key value.
Function Name:
  • damage<-damage-key-value
Return Type:
  • nx/tactics/base/damage
Arguments:
  • Name
    Type
    Generic
    Description
    current
    nx/tactics/base/damage
    key
    vx/core/string
    value
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func damage<-damage-key-value : base/damage [current : base/damage key : string value : string] (switch : base/damage key (case "" current) (case (list "name" "image" "classification") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/damage :prop key :value value))))) :doc "Returns a modified damage from a key value.")
nx/tactics/books/bookloader / damage<-damage-stringmap
Description:
  • Returns a damage from a propmap.
Function Name:
  • damage<-damage-stringmap
Return Type:
  • nx/tactics/base/damage
Arguments:
  • Name
    Type
    Generic
    Description
    damage
    nx/tactics/base/damage
    propmap
    vx/core/stringmap
Usage/Test Cases:
  • (test (base/damage :name "name" :image "image") (damage<-damage-stringmap (empty base/damage) (stringmap :name "name" :image "image")))
Source Code:
  • (func damage<-damage-stringmap : base/damage [damage : base/damage propmap : stringmap] (any<-map-start-reduce : base/damage propmap damage damage<-damage-key-value) :test (test (base/damage :name "name" :image "image") (damage<-damage-stringmap (empty base/damage) (stringmap :name "name" :image "image"))) :doc "Returns a damage from a propmap.")
nx/tactics/books/bookloader / damage<-damage-xmlchild
Description:
  • Returns a modified damage based on a given child Xml.
Function Name:
  • damage<-damage-xmlchild
Return Type:
  • nx/tactics/base/damage
Arguments:
  • Name
    Type
    Generic
    Description
    damage
    nx/tactics/base/damage
    child
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/damage :titles "titles") (damage<-damage-xmlchild (empty base/damage) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles")))))
Source Code:
  • (func damage<-damage-xmlchild : base/damage [damage : base/damage child : xml/xml] (let : base/damage [tag : string := (:tag child)] (switch : base/damage tag (case "" damage) (case (list "reference" "summary" "titles") (copy damage tag (xml/string-first<-xml child))) (else (copy damage (msg<-error :invalidtagfound (anymap :type base/damage :tag tag)))))) :test (test (base/damage :titles "titles") (damage<-damage-xmlchild (empty base/damage) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified damage based on a given child Xml.")
nx/tactics/books/bookloader / damage<-xml
Description:
  • Returns a damage from a given xml.
Function Name:
  • damage<-xml
Return Type:
  • nx/tactics/base/damage
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func damage<-xml : base/damage [xml : xml/xml] (let : base/damage [propmap : stringmap := (:propmap xml) damage : base/damage := (damage<-damage-stringmap (empty base/damage) propmap)] (any<-list-start-reduce : base/damage (:children xml) damage damage<-damage-xmlchild)) :doc "Returns a damage from a given xml.")
nx/tactics/books/bookloader / file-read<-bookname
Description:
  • Returns a file from a bookname.
Function Name:
  • file-read<-bookname
Return Type:
  • vx/data/file/file
Arguments:
  • Name
    Type
    Generic
    Description
    bookname
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func file-read<-bookname : fil/file [bookname : string] (fil/file :path "resources/books" :name (string bookname ".xml")) :doc "Returns a file from a bookname.")
nx/tactics/books/bookloader / file-write<-book
Description:
  • Returns a file with string from book
Function Name:
  • file-write<-book
Return Type:
  • vx/data/file/file
Arguments:
  • Name
    Type
    Generic
    Description
    book
    nx/tactics/base/book
Usage/Test Cases:
Source Code:
  • (func file-write<-book : fil/file [book : base/book] (let : fil/file [bookname : string := (string-writename<-book book)] (fil/file :path "resources/books" :name (string bookname ".vxlisp"))) :doc "Returns a file with string from book")
nx/tactics/books/bookloader / item<-item-key-value
Description:
  • Returns a modified item from a key value.
Function Name:
  • item<-item-key-value
Return Type:
  • nx/tactics/base/item
Arguments:
  • Name
    Type
    Generic
    Description
    current
    nx/tactics/base/item
    key
    vx/core/string
    value
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func item<-item-key-value : base/item [current : base/item key : string value : string] (switch : base/item key (case "" current) (case (list "name" "image" "classification" "length" "mass" "muzzlevelocity" "range" "rof") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/item :prop key :value value))))) :doc "Returns a modified item from a key value.")
nx/tactics/books/bookloader / item<-item-stringmap
Description:
  • Returns a new item from a propmap.
Function Name:
  • item<-item-stringmap
Return Type:
  • nx/tactics/base/item
Arguments:
  • Name
    Type
    Generic
    Description
    item
    nx/tactics/base/item
    propmap
    vx/core/stringmap
Usage/Test Cases:
Source Code:
  • (func item<-item-stringmap : base/item [item : base/item propmap : stringmap] (any<-map-start-reduce : base/item propmap item item<-item-key-value) :doc "Returns a new item from a propmap.")
nx/tactics/books/bookloader / item<-item-xmlchild
Description:
  • Returns a modified item based on a given child xml.
Function Name:
  • item<-item-xmlchild
Return Type:
  • nx/tactics/base/item
Arguments:
  • Name
    Type
    Generic
    Description
    item
    nx/tactics/base/item
    child
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func item<-item-xmlchild : base/item [item : base/item child : xml/xml] (let : base/item [tag : string := (:tag child)] (switch : base/item tag (case "" item) (case (list "reference" "summary" "titles") (copy item tag (xml/string-first<-xml child))) (else (copy item (msg<-error :invalidtagfound (anymap :type base/item :tag tag)))))) :doc "Returns a modified item based on a given child xml.")
nx/tactics/books/bookloader / item<-xml
Description:
  • Returns a item from a given xml.
Function Name:
  • item<-xml
Return Type:
  • nx/tactics/base/item
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func item<-xml : base/item [xml : xml/xml] (let : base/item [propmap : stringmap := (:propmap xml) item : base/item := (item<-item-stringmap (empty base/item) propmap)] (any<-list-start-reduce : base/item (:children xml) item item<-item-xmlchild)) :doc "Returns a item from a given xml.")
nx/tactics/books/bookloader / location<-location-key-value
Description:
  • Returns a modified location from a key value.
Function Name:
  • location<-location-key-value
Return Type:
  • nx/tactics/base/location
Arguments:
  • Name
    Type
    Generic
    Description
    current
    nx/tactics/base/location
    key
    vx/core/string
    value
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func location<-location-key-value : base/location [current : base/location key : string value : string] (switch : base/location key (case "" current) (case (list "name" "image") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/location :prop key :value value))))) :doc "Returns a modified location from a key value.")
nx/tactics/books/bookloader / location<-location-stringmap
Description:
  • Returns a location from a propmap.
Function Name:
  • location<-location-stringmap
Return Type:
  • nx/tactics/base/location
Arguments:
  • Name
    Type
    Generic
    Description
    location
    nx/tactics/base/location
    propmap
    vx/core/stringmap
Usage/Test Cases:
Source Code:
  • (func location<-location-stringmap : base/location [location : base/location propmap : stringmap] (any<-map-start-reduce : base/location propmap location location<-location-key-value) :doc "Returns a location from a propmap.")
nx/tactics/books/bookloader / location<-location-xmlchild
Description:
  • Returns a modified location based on a given child Xml.
Function Name:
  • location<-location-xmlchild
Return Type:
  • nx/tactics/base/location
Arguments:
  • Name
    Type
    Generic
    Description
    location
    nx/tactics/base/location
    child
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func location<-location-xmlchild : base/location [location : base/location child : xml/xml] (let : base/location [tag : string := (:tag child)] (switch : base/location tag (case "" location) (case (list "reference" "summary" "titles") (copy location tag (xml/string-first<-xml child))) (else (copy location (msg<-error :invalidtagfound (anymap :type base/location :tag tag)))))) :doc "Returns a modified location based on a given child Xml.")
nx/tactics/books/bookloader / location<-xml
Description:
  • Returns a location from a given xml.
Function Name:
  • location<-xml
Return Type:
  • nx/tactics/base/location
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func location<-xml : base/location [xml : xml/xml] (let : base/location [propmap : stringmap := (:propmap xml) location : base/location := (location<-location-stringmap (empty base/location) propmap)] (any<-list-start-reduce : base/location (:children xml) location location<-location-xmlchild)) :doc "Returns a location from a given xml.")
nx/tactics/books/bookloader / modifier<-xml
Description:
Function Name:
  • modifier<-xml
Return Type:
  • nx/tactics/base/modifier
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func modifier<-xml : base/modifier)
nx/tactics/books/bookloader / power<-power-key-value
Description:
  • Returns a modified power from a key value.
Function Name:
  • power<-power-key-value
Return Type:
  • nx/tactics/base/power
Arguments:
  • Name
    Type
    Generic
    Description
    current
    nx/tactics/base/power
    key
    vx/core/string
    value
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func power<-power-key-value : base/power [current : base/power key : string value : string] (switch : base/power key (case "" current) (case (list "name" "image" "stat") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/power :prop key :value value))))) :doc "Returns a modified power from a key value.")
nx/tactics/books/bookloader / power<-power-stringmap
Description:
  • Returns a new power from a propmap.
Function Name:
  • power<-power-stringmap
Return Type:
  • nx/tactics/base/power
Arguments:
  • Name
    Type
    Generic
    Description
    power
    nx/tactics/base/power
    propmap
    vx/core/stringmap
Usage/Test Cases:
  • (test (base/power :name "name" :image "image") (power<-power-stringmap (empty base/power) (stringmap :name "name" :image "image")))
Source Code:
  • (func power<-power-stringmap : base/power [power : base/power propmap : stringmap] (any<-map-start-reduce : base/power propmap power power<-power-key-value) :test (test (base/power :name "name" :image "image") (power<-power-stringmap (empty base/power) (stringmap :name "name" :image "image"))) :doc "Returns a new power from a propmap.")
nx/tactics/books/bookloader / power<-power-xmlchild
Description:
  • Returns a modified power based on a given child xml.
Function Name:
  • power<-power-xmlchild
Return Type:
  • nx/tactics/base/power
Arguments:
  • Name
    Type
    Generic
    Description
    power
    nx/tactics/base/power
    child
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/power :titles "titles") (power<-power-xmlchild (empty base/power) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles")))))
Source Code:
  • (func power<-power-xmlchild : base/power [power : base/power child : xml/xml] (let : base/power [tag : string := (:tag child)] (switch : base/power tag (case "" power) (case (list "reference" "summary" "titles") (copy power tag (xml/string-first<-xml child))) (case "ability" (power<-power-xmlability power child)) (case "specialty" (power<-power-xmlspecialty power child)) (else (copy power (msg<-error :invalidtagfound (anymap :type base/power :tag tag)))))) :test (test (base/power :titles "titles") (power<-power-xmlchild (empty base/power) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified power based on a given child xml.")
nx/tactics/books/bookloader / power<-xml
Description:
  • Returns a power from a given Xml.
Function Name:
  • power<-xml
Return Type:
  • nx/tactics/base/power
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/power :name "name" :image "image" :titles "titles" :reference "reference" :abilitymap (base/abilitymap :ability1 (base/ability :name "ability1")) :specialtymap (base/specialtymap :specialty1 (base/specialty :name "specialty1"))) (power<-xml (xml/xml :tag "power" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))) (xml/xml :tag "ability" :propmap (stringmap :name "ability1")) (xml/xml :tag "specialty" :propmap (stringmap :name "specialty1"))))))
Source Code:
  • (func power<-xml : base/power [xml : xml/xml] (let : base/power [propmap : stringmap := (:propmap xml) children : xmllist := (:children xml) power : base/power := (power<-power-stringmap (empty base/power) propmap)] (any<-list-start-reduce : base/power children power power<-power-xmlchild)) :test (test (base/power :name "name" :image "image" :titles "titles" :reference "reference" :abilitymap (base/abilitymap :ability1 (base/ability :name "ability1")) :specialtymap (base/specialtymap :specialty1 (base/specialty :name "specialty1"))) (power<-xml (xml/xml :tag "power" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))) (xml/xml :tag "ability" :propmap (stringmap :name "ability1")) (xml/xml :tag "specialty" :propmap (stringmap :name "specialty1")))))) :doc "Returns a power from a given Xml.")
nx/tactics/books/bookloader / power<-power-xmlability
Description:
  • Return a power with new ability added to abilitymap
Function Name:
  • power<-power-xmlability
Return Type:
  • nx/tactics/base/power
Arguments:
  • Name
    Type
    Generic
    Description
    power
    nx/tactics/base/power
    xmlability
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func power<-power-xmlability : base/power [power : base/power xmlability : xml/xml] (let : base/power [ability : base/ability := (ability<-xml xmlability) name : string := (:name ability) origmap : base/abilitymap := (:abilitymap power) chgmap : base/abilitymap := (copy origmap name ability)] (copy power :abilitymap chgmap)) :doc "Return a power with new ability added to abilitymap")
nx/tactics/books/bookloader / power<-power-xmlspecialty
Description:
  • Return a power with new specialty added to specialtymap
Function Name:
  • power<-power-xmlspecialty
Return Type:
  • nx/tactics/base/power
Arguments:
  • Name
    Type
    Generic
    Description
    power
    nx/tactics/base/power
    xmlspecialty
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func power<-power-xmlspecialty : base/power [power : base/power xmlspecialty : xml/xml] (let : base/power [specialty : base/specialty := (specialty<-xml xmlspecialty) name : string := (:name specialty) origmap : base/specialtymap := (:specialtymap power) chgmap : base/specialtymap := (copy origmap name specialty)] (copy power :specialtymap chgmap)) :doc "Return a power with new specialty added to specialtymap")
nx/tactics/books/bookloader / rule<-rule-key-value
Description:
  • Returns a modified rule from a key value.
Function Name:
  • rule<-rule-key-value
Return Type:
  • nx/tactics/base/rule
Arguments:
  • Name
    Type
    Generic
    Description
    current
    nx/tactics/base/rule
    key
    vx/core/string
    value
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func rule<-rule-key-value : base/rule [current : base/rule key : string value : string] (switch : base/rule key (case "" current) (case (list "name" "image" "classification") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/rule :prop key :value value))))) :doc "Returns a modified rule from a key value.")
nx/tactics/books/bookloader / rule<-rule-stringmap
Description:
  • Returns a rule from a propmap.
Function Name:
  • rule<-rule-stringmap
Return Type:
  • nx/tactics/base/rule
Arguments:
  • Name
    Type
    Generic
    Description
    rule
    nx/tactics/base/rule
    propmap
    vx/core/stringmap
Usage/Test Cases:
  • (test (base/rule :name "name" :image "image") (rule<-rule-stringmap (empty base/rule) (stringmap :name "name" :image "image")))
Source Code:
  • (func rule<-rule-stringmap : base/rule [rule : base/rule propmap : stringmap] (any<-map-start-reduce : base/rule propmap rule rule<-rule-key-value) :test (test (base/rule :name "name" :image "image") (rule<-rule-stringmap (empty base/rule) (stringmap :name "name" :image "image"))) :doc "Returns a rule from a propmap.")
nx/tactics/books/bookloader / rule<-rule-xmlchild
Description:
  • Returns a modified rule based on a given child Xml.
Function Name:
  • rule<-rule-xmlchild
Return Type:
  • nx/tactics/base/rule
Arguments:
  • Name
    Type
    Generic
    Description
    rule
    nx/tactics/base/rule
    child
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/rule :titles "titles") (rule<-rule-xmlchild (empty base/rule) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles")))))
Source Code:
  • (func rule<-rule-xmlchild : base/rule [rule : base/rule child : xml/xml] (let : base/rule [tag : string := (:tag child)] (switch : base/rule tag (case "" rule) (case (list "reference" "summary" "titles" "classification") (copy rule tag (xml/string-first<-xml child))) (else (copy rule (msg<-error :invalidtagfound (anymap :type base/rule :tag tag)))))) :test (test (base/rule :titles "titles") (rule<-rule-xmlchild (empty base/rule) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified rule based on a given child Xml.")
nx/tactics/books/bookloader / rule<-xml
Description:
  • Returns a rule from a given xml.
Function Name:
  • rule<-xml
Return Type:
  • nx/tactics/base/rule
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func rule<-xml : base/rule [xml : xml/xml] (let : base/rule [propmap : stringmap := (:propmap xml) rule : base/rule := (rule<-rule-stringmap (empty base/rule) propmap)] (any<-list-start-reduce : base/rule (:children xml) rule rule<-rule-xmlchild)) :doc "Returns a rule from a given xml.")
nx/tactics/books/bookloader / scenario<-scenario-key-value
Description:
  • Returns a modified scenario from a key value.
Function Name:
  • scenario<-scenario-key-value
Return Type:
  • nx/tactics/base/scenario
Arguments:
  • Name
    Type
    Generic
    Description
    current
    nx/tactics/base/scenario
    key
    vx/core/string
    value
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func scenario<-scenario-key-value : base/scenario [current : base/scenario key : string value : string] (switch : base/scenario key (case "" current) (case (list "name" "image") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/scenario :prop key :value value))))) :doc "Returns a modified scenario from a key value.")
nx/tactics/books/bookloader / scenario<-scenario-stringmap
Description:
  • Returns a scenario from a propmap.
Function Name:
  • scenario<-scenario-stringmap
Return Type:
  • nx/tactics/base/scenario
Arguments:
  • Name
    Type
    Generic
    Description
    scenario
    nx/tactics/base/scenario
    propmap
    vx/core/stringmap
Usage/Test Cases:
Source Code:
  • (func scenario<-scenario-stringmap : base/scenario [scenario : base/scenario propmap : stringmap] (any<-map-start-reduce : base/scenario propmap scenario scenario<-scenario-key-value) :doc "Returns a scenario from a propmap.")
nx/tactics/books/bookloader / scenario<-scenario-xmlchild
Description:
  • Returns a modified scenario based on a given child Xml.
Function Name:
  • scenario<-scenario-xmlchild
Return Type:
  • nx/tactics/base/scenario
Arguments:
  • Name
    Type
    Generic
    Description
    scenario
    nx/tactics/base/scenario
    child
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func scenario<-scenario-xmlchild : base/scenario [scenario : base/scenario child : xml/xml] (let : base/scenario [tag : string := (:tag child)] (switch : base/scenario tag (case "" scenario) (case (list "reference" "summary" "titles") (copy scenario tag (xml/string-first<-xml child))) (else (copy scenario (msg<-error :invalidtagfound (anymap :type base/scenario :tag tag)))))) :doc "Returns a modified scenario based on a given child Xml.")
nx/tactics/books/bookloader / scenario<-xml
Description:
  • Returns a scenario from a given xml.
Function Name:
  • scenario<-xml
Return Type:
  • nx/tactics/base/scenario
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/scenario :name "name" :image "image" :titles "titles" :reference "reference") (scenario<-xml (xml/xml :tag "scenario" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference")))))))
Source Code:
  • (func scenario<-xml : base/scenario [xml : xml/xml] (let : base/scenario [propmap : stringmap := (:propmap xml) scen : base/scenario := (scenario<-scenario-stringmap (empty base/scenario) propmap)] (any<-list-start-reduce : base/scenario (:children xml) scen scenario<-scenario-xmlchild)) :test (test (base/scenario :name "name" :image "image" :titles "titles" :reference "reference") (scenario<-xml (xml/xml :tag "scenario" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))))))) :doc "Returns a scenario from a given xml.")
nx/tactics/books/bookloader / section<-section-key-value
Description:
  • Returns a modified section from a key value.
Function Name:
  • section<-section-key-value
Return Type:
  • nx/tactics/base/section
Arguments:
  • Name
    Type
    Generic
    Description
    current
    nx/tactics/base/section
    key
    vx/core/string
    value
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func section<-section-key-value : base/section [current : base/section key : string value : string] (switch : base/section key (case "" current) (case (list "name" "image") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/section :prop key :value value))))) :doc "Returns a modified section from a key value.")
nx/tactics/books/bookloader / section<-section-stringmap
Description:
  • Returns a new book from a propmap.
Function Name:
  • section<-section-stringmap
Return Type:
  • nx/tactics/base/section
Arguments:
  • Name
    Type
    Generic
    Description
    section
    nx/tactics/base/section
    propmap
    vx/core/stringmap
Usage/Test Cases:
Source Code:
  • (func section<-section-stringmap : base/section [section : base/section propmap : stringmap] (any<-map-start-reduce : base/section propmap section section<-section-key-value) :doc "Returns a new book from a propmap.")
nx/tactics/books/bookloader / section<-section-xmlchild
Description:
  • Returns a modified section based on a given child Xml.
Function Name:
  • section<-section-xmlchild
Return Type:
  • nx/tactics/base/section
Arguments:
  • Name
    Type
    Generic
    Description
    section
    nx/tactics/base/section
    child
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func section<-section-xmlchild : base/section [section : base/section child : xml/xml] (let : base/section [tag : string := (:tag child)] (switch : base/section tag (case "" section) (case (list "reference" "summary" "titles") (copy section tag (xml/string-first<-xml child))) (case "damage" (section<-section-xmldamage section child)) (case "item" (section<-section-xmlitem section child)) (case "place" (section<-section-xmllocation section child)) (case "power" (section<-section-xmlpower section child)) (case "rule" (section<-section-xmlrule section child)) (case "scenario" (section<-section-xmlscenario section child)) (case "section" (section<-section-xmlsection section child)) (case "skill" (section<-section-xmlskill section child)) (case "terrain" (section<-section-xmlterrain section child)) (case "unit" (section<-section-xmlunit section child)) (else (copy section (msg<-error :invalidtagfound (anymap :type base/section :tag tag)))))) :doc "Returns a modified section based on a given child Xml.")
nx/tactics/books/bookloader / section<-section-xmldamage
Description:
  • Return a section with new damage added to damagemap
Function Name:
  • section<-section-xmldamage
Return Type:
  • nx/tactics/base/section
Arguments:
  • Name
    Type
    Generic
    Description
    section
    nx/tactics/base/section
    xmldamage
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func section<-section-xmldamage : base/section [section : base/section xmldamage : xml/xml] (let : base/section [current : base/damage := (damage<-xml xmldamage) name : string := (:name current) origmap : base/damagemap := (:damagemap section) chgmap : base/damagemap := (copy origmap name current)] (copy section :damagemap chgmap)) :doc "Return a section with new damage added to damagemap")
nx/tactics/books/bookloader / section<-section-xmlitem
Description:
  • Return a section with new item added to itemmap
Function Name:
  • section<-section-xmlitem
Return Type:
  • nx/tactics/base/section
Arguments:
  • Name
    Type
    Generic
    Description
    section
    nx/tactics/base/section
    xmlitem
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func section<-section-xmlitem : base/section [section : base/section xmlitem : xml/xml] (let : base/section [item : base/item := (item<-xml xmlitem) name : string := (:name item) origmap : base/itemmap := (:itemmap section) chgmap : base/itemmap := (copy origmap name item)] (copy section :itemmap chgmap)) :doc "Return a section with new item added to itemmap")
nx/tactics/books/bookloader / section<-section-xmllocation
Description:
  • Return a section with new location added to locationmap
Function Name:
  • section<-section-xmllocation
Return Type:
  • nx/tactics/base/section
Arguments:
  • Name
    Type
    Generic
    Description
    section
    nx/tactics/base/section
    xmllocation
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func section<-section-xmllocation : base/section [section : base/section xmllocation : xml/xml] (let : base/section [location : base/location := (location<-xml xmllocation) name : string := (:name location) origmap : base/locationmap := (:locationmap section) chgmap : base/locationmap := (copy origmap name location)] (copy section :locationmap chgmap)) :doc "Return a section with new location added to locationmap")
nx/tactics/books/bookloader / section<-section-xmlpower
Description:
  • Return a section with new power added to powermap
Function Name:
  • section<-section-xmlpower
Return Type:
  • nx/tactics/base/section
Arguments:
  • Name
    Type
    Generic
    Description
    section
    nx/tactics/base/section
    xmlpower
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func section<-section-xmlpower : base/section [section : base/section xmlpower : xml/xml] (let : base/section [power : base/power := (power<-xml xmlpower) name : string := (:name power) origmap : base/powermap := (:powermap section) chgmap : base/powermap := (copy origmap name power)] (copy section :powermap chgmap)) :doc "Return a section with new power added to powermap")
nx/tactics/books/bookloader / section<-section-xmlrule
Description:
  • Return a section with new rule added to rulemap
Function Name:
  • section<-section-xmlrule
Return Type:
  • nx/tactics/base/section
Arguments:
  • Name
    Type
    Generic
    Description
    section
    nx/tactics/base/section
    xmlrule
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func section<-section-xmlrule : base/section [section : base/section xmlrule : xml/xml] (let : base/section [rule : base/rule := (rule<-xml xmlrule) name : string := (:name rule) rulemap : base/rulemap := (:rulemap section) chgmap : base/rulemap := (copy rulemap name rule)] (copy section :rulemap chgmap)) :doc "Return a section with new rule added to rulemap")
nx/tactics/books/bookloader / section<-section-xmlscenario
Description:
  • Return a section with new scenario added to scenariomap
Function Name:
  • section<-section-xmlscenario
Return Type:
  • nx/tactics/base/section
Arguments:
  • Name
    Type
    Generic
    Description
    section
    nx/tactics/base/section
    xmlscenario
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func section<-section-xmlscenario : base/section [section : base/section xmlscenario : xml/xml] (let : base/section [scenario : base/scenario := (scenario<-xml xmlscenario) name : string := (:name scenario) scenariomap : base/scenariomap := (:scenariomap section) chgmap : base/scenariomap := (copy scenariomap name scenario)] (copy section :scenariomap chgmap)) :doc "Return a section with new scenario added to scenariomap")
nx/tactics/books/bookloader / section<-section-xmlsection
Description:
  • Return a section with new section added to sectionmap
Function Name:
  • section<-section-xmlsection
Return Type:
  • nx/tactics/base/section
Arguments:
  • Name
    Type
    Generic
    Description
    section
    nx/tactics/base/section
    xmlsection
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func section<-section-xmlsection : base/section [section : base/section xmlsection : xml/xml] (let : base/section [subsect : base/section := (section<-xml xmlsection) name : string := (:name subsect) sectionmap : base/sectionmap := (:sectionmap section) chgmap : base/sectionmap := (copy sectionmap name subsect)] (copy section :sectionmap chgmap)) :doc "Return a section with new section added to sectionmap")
nx/tactics/books/bookloader / section<-section-xmlskill
Description:
  • Return a section with new skill added to skillmap
Function Name:
  • section<-section-xmlskill
Return Type:
  • nx/tactics/base/section
Arguments:
  • Name
    Type
    Generic
    Description
    section
    nx/tactics/base/section
    xmlskill
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func section<-section-xmlskill : base/section [section : base/section xmlskill : xml/xml] (let : base/section [skill : base/skill := (skill<-xml xmlskill) name : string := (:name skill) origmap : base/skillmap := (:skillmap section) chgmap : base/skillmap := (copy origmap name skill)] (copy section :skillmap chgmap)) :doc "Return a section with new skill added to skillmap")
nx/tactics/books/bookloader / section<-section-xmlterrain
Description:
  • Return a section with new terrain added to terrainmap
Function Name:
  • section<-section-xmlterrain
Return Type:
  • nx/tactics/base/section
Arguments:
  • Name
    Type
    Generic
    Description
    section
    nx/tactics/base/section
    xmlterrain
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func section<-section-xmlterrain : base/section [section : base/section xmlterrain : xml/xml] (let : base/section [current : base/terrain := (terrain<-xml xmlterrain) name : string := (:name current) origmap : base/terrainmap := (:terrainmap section) chgmap : base/terrainmap := (copy origmap name current)] (copy section :terrainmap chgmap)) :doc "Return a section with new terrain added to terrainmap")
nx/tactics/books/bookloader / section<-section-xmlunit
Description:
  • Return a section with new unit added to unitmap
Function Name:
  • section<-section-xmlunit
Return Type:
  • nx/tactics/base/section
Arguments:
  • Name
    Type
    Generic
    Description
    section
    nx/tactics/base/section
    xmlunit
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func section<-section-xmlunit : base/section [section : base/section xmlunit : xml/xml] (let : base/section [unit : base/unit := (unit<-xml xmlunit) name : string := (:name unit) unitmap : base/unitmap := (:unitmap section) chgmap : base/unitmap := (copy unitmap name unit)] (copy section :unitmap chgmap)) :doc "Return a section with new unit added to unitmap")
nx/tactics/books/bookloader / section<-xml
Description:
  • Returns a section from a given Xml.
Function Name:
  • section<-xml
Return Type:
  • nx/tactics/base/section
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/section :name "name" :image "image" :titles "titles" :reference "reference" :powermap (base/powermap :power1 (base/power :name "power1")) :scenariomap (base/scenariomap :scenario1 (base/scenario :name "scenario1")) :sectionmap (base/sectionmap :section1 (base/section :name "section1")) :skillmap (base/skillmap :skill1 (base/skill :name "skill1"))) (section<-xml (xml/xml :tag "section" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))) (xml/xml :tag "power" :propmap (stringmap :name "power1")) (xml/xml :tag "scenario" :propmap (stringmap :name "scenario1")) (xml/xml :tag "section" :propmap (stringmap :name "section1")) (xml/xml :tag "skill" :propmap (stringmap :name "skill1"))))))
Source Code:
  • (func section<-xml : base/section [xml : xml/xml] (let : base/section [propmap : stringmap := (:propmap xml) children : xml/xmllist := (:children xml) section : base/section := (section<-section-stringmap (empty base/section) propmap)] (any<-list-start-reduce : base/section children section section<-section-xmlchild)) :test (test (base/section :name "name" :image "image" :titles "titles" :reference "reference" :powermap (base/powermap :power1 (base/power :name "power1")) :scenariomap (base/scenariomap :scenario1 (base/scenario :name "scenario1")) :sectionmap (base/sectionmap :section1 (base/section :name "section1")) :skillmap (base/skillmap :skill1 (base/skill :name "skill1"))) (section<-xml (xml/xml :tag "section" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))) (xml/xml :tag "power" :propmap (stringmap :name "power1")) (xml/xml :tag "scenario" :propmap (stringmap :name "scenario1")) (xml/xml :tag "section" :propmap (stringmap :name "section1")) (xml/xml :tag "skill" :propmap (stringmap :name "skill1")))))) :doc "Returns a section from a given Xml.")
nx/tactics/books/bookloader / skill<-skill-key-value
Description:
  • Returns a modified skill from a key value.
Function Name:
  • skill<-skill-key-value
Return Type:
  • nx/tactics/base/skill
Arguments:
  • Name
    Type
    Generic
    Description
    current
    nx/tactics/base/skill
    key
    vx/core/string
    value
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func skill<-skill-key-value : base/skill [current : base/skill key : string value : string] (switch : base/skill key (case "" current) (case (list "name" "image" "stat") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/skill :prop key :value value))))) :doc "Returns a modified skill from a key value.")
nx/tactics/books/bookloader / skill<-skill-stringmap
Description:
  • Returns a new skill from a propmap.
Function Name:
  • skill<-skill-stringmap
Return Type:
  • nx/tactics/base/skill
Arguments:
  • Name
    Type
    Generic
    Description
    skill
    nx/tactics/base/skill
    propmap
    vx/core/stringmap
Usage/Test Cases:
Source Code:
  • (func skill<-skill-stringmap : base/skill [skill : base/skill propmap : stringmap] (any<-map-start-reduce : base/skill propmap skill skill<-skill-key-value) :doc "Returns a new skill from a propmap.")
nx/tactics/books/bookloader / skill<-skill-xmlchild
Description:
  • Returns a modified skill based on a given child Xml.
Function Name:
  • skill<-skill-xmlchild
Return Type:
  • nx/tactics/base/skill
Arguments:
  • Name
    Type
    Generic
    Description
    skill
    nx/tactics/base/skill
    child
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/skill :titles "titles") (skill<-skill-xmlchild (empty base/skill) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles")))))
Source Code:
  • (func skill<-skill-xmlchild : base/skill [skill : base/skill child : xml/xml] (let : base/skill [tag : string := (:tag child)] (switch : base/skill tag (case "" skill) (case (list "reference" "summary" "titles") (copy skill tag (xml/string-first<-xml child))) (case "ability" (skill<-skill-xmlability skill child)) (case "specialty" (skill<-skill-xmlspecialty skill child)) (else (copy skill (msg<-error :invalidtagfound (anymap :type base/skill :tag tag)))))) :test (test (base/skill :titles "titles") (skill<-skill-xmlchild (empty base/skill) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified skill based on a given child Xml.")
nx/tactics/books/bookloader / skill<-skill-xmlability
Description:
  • Return a skill with new ability added to abilitymap
Function Name:
  • skill<-skill-xmlability
Return Type:
  • nx/tactics/base/skill
Arguments:
  • Name
    Type
    Generic
    Description
    skill
    nx/tactics/base/skill
    xmlability
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func skill<-skill-xmlability : base/skill [skill : base/skill xmlability : xml/xml] (let : base/skill [ability : base/ability := (ability<-xml xmlability) name : string := (:name ability) origmap : base/abilitymap := (:abilitymap skill) chgmap : base/abilitymap := (copy origmap name ability)] (copy skill :abilitymap chgmap)) :doc "Return a skill with new ability added to abilitymap")
nx/tactics/books/bookloader / skill<-skill-xmlspecialty
Description:
  • Return a skill with new specialty added to specialtymap
Function Name:
  • skill<-skill-xmlspecialty
Return Type:
  • nx/tactics/base/skill
Arguments:
  • Name
    Type
    Generic
    Description
    skill
    nx/tactics/base/skill
    xmlspecialty
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func skill<-skill-xmlspecialty : base/skill [skill : base/skill xmlspecialty : xml/xml] (let : base/skill [specialty : base/specialty := (specialty<-xml xmlspecialty) name : string := (:name specialty) origmap : base/specialtymap := (:specialtymap skill) chgmap : base/specialtymap := (copy origmap name specialty)] (copy skill :specialtymap chgmap)) :doc "Return a skill with new specialty added to specialtymap")
nx/tactics/books/bookloader / skill<-xml
Description:
  • Returns a skill from a given xml.
Function Name:
  • skill<-xml
Return Type:
  • nx/tactics/base/skill
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/skill :name "name" :image "image" :titles "titles" :reference "reference" :abilitymap (base/abilitymap :ability1 (base/ability :name "ability1")) :specialtymap (base/specialtymap :specialty1 (base/specialty :name "specialty1"))) (skill<-xml (xml/xml :tag "skill" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))) (xml/xml :tag "ability" :propmap (stringmap :name "ability1")) (xml/xml :tag "specialty" :propmap (stringmap :name "specialty1"))))))
Source Code:
  • (func skill<-xml : base/skill [xml : xml/xml] (let : base/skill [propmap : stringmap := (:propmap xml) skill : base/skill := (skill<-skill-stringmap (empty base/skill) propmap)] (any<-list-start-reduce : base/skill (:children xml) skill skill<-skill-xmlchild)) :test (test (base/skill :name "name" :image "image" :titles "titles" :reference "reference" :abilitymap (base/abilitymap :ability1 (base/ability :name "ability1")) :specialtymap (base/specialtymap :specialty1 (base/specialty :name "specialty1"))) (skill<-xml (xml/xml :tag "skill" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))) (xml/xml :tag "ability" :propmap (stringmap :name "ability1")) (xml/xml :tag "specialty" :propmap (stringmap :name "specialty1")))))) :doc "Returns a skill from a given xml.")
nx/tactics/books/bookloader / specialty<-specialty-key-value
Description:
  • Returns a modified specialty from a key value.
Function Name:
  • specialty<-specialty-key-value
Return Type:
  • nx/tactics/base/specialty
Arguments:
  • Name
    Type
    Generic
    Description
    current
    nx/tactics/base/specialty
    key
    vx/core/string
    value
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func specialty<-specialty-key-value : base/specialty [current : base/specialty key : string value : string] (switch : base/specialty key (case "" current) (case (list "name" "image") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/specialty :prop key :value value))))) :doc "Returns a modified specialty from a key value.")
nx/tactics/books/bookloader / specialty<-specialty-stringmap
Description:
  • Returns a new specialty from a propmap.
Function Name:
  • specialty<-specialty-stringmap
Return Type:
  • nx/tactics/base/specialty
Arguments:
  • Name
    Type
    Generic
    Description
    specialty
    nx/tactics/base/specialty
    propmap
    vx/core/stringmap
Usage/Test Cases:
  • (test (base/specialty :name "name" :image "image") (specialty<-specialty-stringmap (empty base/specialty) (stringmap :name "name" :image "image")))
Source Code:
  • (func specialty<-specialty-stringmap : base/specialty [specialty : base/specialty propmap : stringmap] (any<-map-start-reduce : base/specialty propmap specialty specialty<-specialty-key-value) :test (test (base/specialty :name "name" :image "image") (specialty<-specialty-stringmap (empty base/specialty) (stringmap :name "name" :image "image"))) :doc "Returns a new specialty from a propmap.")
nx/tactics/books/bookloader / specialty<-specialty-xmlchild
Description:
  • Returns a modified specialty based on a given child xml.
Function Name:
  • specialty<-specialty-xmlchild
Return Type:
  • nx/tactics/base/specialty
Arguments:
  • Name
    Type
    Generic
    Description
    specialty
    nx/tactics/base/specialty
    child
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/specialty :titles "titles") (specialty<-specialty-xmlchild (empty base/specialty) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles")))))
Source Code:
  • (func specialty<-specialty-xmlchild : base/specialty [specialty : base/specialty child : xml/xml] (let : base/specialty [tag : string := (:tag child)] (switch : base/specialty tag (case "" specialty) (case (list "reference" "summary" "titles") (copy specialty tag (xml/string-first<-xml child))) (else (copy specialty (msg<-error :invalidtagfound (anymap :type base/specialty :tag tag)))))) :test (test (base/specialty :titles "titles") (specialty<-specialty-xmlchild (empty base/specialty) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified specialty based on a given child xml.")
nx/tactics/books/bookloader / specialty<-xml
Description:
  • Returns a specialty from a given xml.
Function Name:
  • specialty<-xml
Return Type:
  • nx/tactics/base/specialty
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/specialty :name "name" :image "image" :titles "titles" :reference "reference") (specialty<-xml (xml/xml :tag "specialty" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference")))))))
Source Code:
  • (func specialty<-xml : base/specialty [xml : xml/xml] (let : base/specialty [propmap : stringmap := (:propmap xml) spc : base/specialty := (specialty<-specialty-stringmap (empty base/specialty) propmap)] (any<-list-start-reduce : base/specialty (:children xml) spc specialty<-specialty-xmlchild)) :test (test (base/specialty :name "name" :image "image" :titles "titles" :reference "reference") (specialty<-xml (xml/xml :tag "specialty" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))))))) :doc "Returns a specialty from a given xml.")
nx/tactics/books/bookloader / string-read<-bookname
Description:
  • Returns text from a file with bookname.
Function Name:
  • string-read<-bookname
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    bookname
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func string-read<-bookname : string [bookname : string] (string-read<-file (file-read<-bookname bookname)) :context :doc "Returns text from a file with bookname.")
nx/tactics/books/bookloader / string-vxlisp<-book
Description:
  • Returns a vxlisp string from a book.
Function Name:
  • string-vxlisp<-book
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    book
    nx/tactics/base/book
Usage/Test Cases:
Source Code:
  • (func string-vxlisp<-book : string [book : base/book] (let : string [name : string := (bl/string-writename<-book book) text : string := (string<-any-indent book 1 false)] (string "(package nx/tactics/books/" name "\n :libs (lib base :path nx/tactics/base))\n\n(func tacticsbook : base/book\n " text ")\n")) :doc "Returns a vxlisp string from a book.")
nx/tactics/books/bookloader / string-writename<-book
Description:
  • Returns the write filename from a book
Function Name:
  • string-writename<-book
Return Type:
  • vx/core/string
Arguments:
  • Name
    Type
    Generic
    Description
    book
    nx/tactics/base/book
Usage/Test Cases:
Source Code:
  • (func string-writename<-book : string [book : base/book] (let : string [name : string := (:name book) lower : string := (typ/string-lowercase name) space : string := (string<-string-find-replace lower " " "_") comma : string := (string<-string-find-replace space "," "")] comma) :doc "Returns the write filename from a book")
nx/tactics/books/bookloader / terrain<-terrain-key-value
Description:
  • Returns a modified terrain from a key value.
Function Name:
  • terrain<-terrain-key-value
Return Type:
  • nx/tactics/base/terrain
Arguments:
  • Name
    Type
    Generic
    Description
    current
    nx/tactics/base/terrain
    key
    vx/core/string
    value
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func terrain<-terrain-key-value : base/terrain [current : base/terrain key : string value : string] (switch : base/terrain key (case "" current) (case (list "name" "image") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/terrain :prop key :value value))))) :doc "Returns a modified terrain from a key value.")
nx/tactics/books/bookloader / terrain<-terrain-stringmap
Description:
  • Returns a terrain from a propmap.
Function Name:
  • terrain<-terrain-stringmap
Return Type:
  • nx/tactics/base/terrain
Arguments:
  • Name
    Type
    Generic
    Description
    terrain
    nx/tactics/base/terrain
    propmap
    vx/core/stringmap
Usage/Test Cases:
  • (test (base/terrain :name "name" :image "image") (terrain<-terrain-stringmap (empty base/terrain) (stringmap :name "name" :image "image")))
Source Code:
  • (func terrain<-terrain-stringmap : base/terrain [terrain : base/terrain propmap : stringmap] (any<-map-start-reduce : base/terrain propmap terrain terrain<-terrain-key-value) :test (test (base/terrain :name "name" :image "image") (terrain<-terrain-stringmap (empty base/terrain) (stringmap :name "name" :image "image"))) :doc "Returns a terrain from a propmap.")
nx/tactics/books/bookloader / terrain<-terrain-xmlchild
Description:
  • Returns a modified terrain based on a given child Xml.
Function Name:
  • terrain<-terrain-xmlchild
Return Type:
  • nx/tactics/base/terrain
Arguments:
  • Name
    Type
    Generic
    Description
    terrain
    nx/tactics/base/terrain
    child
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/terrain :titles "titles") (terrain<-terrain-xmlchild (empty base/terrain) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles")))))
Source Code:
  • (func terrain<-terrain-xmlchild : base/terrain [terrain : base/terrain child : xml/xml] (let : base/terrain [tag : string := (:tag child)] (switch : base/terrain tag (case "" terrain) (case (list "reference" "summary" "titles" "classification") (copy terrain tag (xml/string-first<-xml child))) (else (copy terrain (msg<-error :invalidtagfound (anymap :type base/terrain :tag tag)))))) :test (test (base/terrain :titles "titles") (terrain<-terrain-xmlchild (empty base/terrain) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified terrain based on a given child Xml.")
nx/tactics/books/bookloader / terrain<-xml
Description:
  • Returns a terrain from a given xml.
Function Name:
  • terrain<-xml
Return Type:
  • nx/tactics/base/terrain
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func terrain<-xml : base/terrain [xml : xml/xml] (let : base/terrain [propmap : stringmap := (:propmap xml) terrain : base/terrain := (terrain<-terrain-stringmap (empty base/terrain) propmap)] (any<-list-start-reduce : base/terrain (:children xml) terrain terrain<-terrain-xmlchild)) :doc "Returns a terrain from a given xml.")
nx/tactics/books/bookloader / unit<-unit-key-value
Description:
  • Returns a modified unit from a key value.
Function Name:
  • unit<-unit-key-value
Return Type:
  • nx/tactics/base/unit
Arguments:
  • Name
    Type
    Generic
    Description
    current
    nx/tactics/base/unit
    key
    vx/core/string
    value
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func unit<-unit-key-value : base/unit [current : base/unit key : string value : string] (switch : base/unit key (case "" current) (case (list "name" "image" "classification" "crew" "body" "height" "length" "mass" "mind" "speed" "width" "will") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/unit :prop key :value value))))) :doc "Returns a modified unit from a key value.")
nx/tactics/books/bookloader / unit<-unit-stringmap
Description:
  • Returns a new unit from a propmap.
Function Name:
  • unit<-unit-stringmap
Return Type:
  • nx/tactics/base/unit
Arguments:
  • Name
    Type
    Generic
    Description
    unit
    nx/tactics/base/unit
    propmap
    vx/core/stringmap
Usage/Test Cases:
  • (test (base/unit :name "name" :image "image") (unit<-unit-stringmap (empty base/unit) (stringmap :name "name" :image "image")))
Source Code:
  • (func unit<-unit-stringmap : base/unit [unit : base/unit propmap : stringmap] (any<-map-start-reduce propmap unit unit<-unit-key-value) :test (test (base/unit :name "name" :image "image") (unit<-unit-stringmap (empty base/unit) (stringmap :name "name" :image "image"))) :doc "Returns a new unit from a propmap.")
nx/tactics/books/bookloader / unit<-unit-xmlchild
Description:
  • Returns a modified unit based on a given child Xml.
Function Name:
  • unit<-unit-xmlchild
Return Type:
  • nx/tactics/base/unit
Arguments:
  • Name
    Type
    Generic
    Description
    unit
    nx/tactics/base/unit
    child
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/unit :titles "titles") (unit<-unit-xmlchild (empty base/unit) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles")))))
Source Code:
  • (func unit<-unit-xmlchild : base/unit [unit : base/unit child : xml/xml] (let : base/unit [tag : string := (:tag child)] (switch : base/unit tag (case "" unit) (case (list "reference" "summary" "titles") (copy unit tag (xml/string-first<-xml child))) (case "power" (unit<-unit-xmlpower unit child)) (case "skill" (unit<-unit-xmlskill unit child)) (case "weakness" (unit<-unit-xmlweakness unit child)) (else (copy unit (msg<-error :invalidtagfound (anymap :type base/unit :tag tag)))))) :test (test (base/unit :titles "titles") (unit<-unit-xmlchild (empty base/unit) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified unit based on a given child Xml.")
nx/tactics/books/bookloader / unit<-unit-xmlpower
Description:
  • Return a unit with new unit added to unitpowermap
Function Name:
  • unit<-unit-xmlpower
Return Type:
  • nx/tactics/base/unit
Arguments:
  • Name
    Type
    Generic
    Description
    unit
    nx/tactics/base/unit
    xmlpower
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func unit<-unit-xmlpower : base/unit [unit : base/unit xmlpower : xml/xml] (let : base/unit [unitpower : base/unitpower := (unitpower<-xml xmlpower) name : string := (:name unitpower) unitpowermap : base/unitpowermap := (:unitpowermap unit) chgmap : base/unitpowermap := (copy unitpowermap name unitpower)] (copy unit :unitpowermap chgmap)) :doc "Return a unit with new unit added to unitpowermap")
nx/tactics/books/bookloader / unit<-unit-xmlskill
Description:
  • Return a unit with new unitskill added to unitskillmap
Function Name:
  • unit<-unit-xmlskill
Return Type:
  • nx/tactics/base/unit
Arguments:
  • Name
    Type
    Generic
    Description
    unit
    nx/tactics/base/unit
    xmlskill
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func unit<-unit-xmlskill : base/unit [unit : base/unit xmlskill : xml/xml] (let : base/unit [unitskill : base/unitskill := (unitskill<-xml xmlskill) name : string := (:name unitskill) unitskillmap : base/unitskillmap := (:unitskillmap unit) chgmap : base/unitskillmap := (copy unitskillmap name unitskill)] (copy unit :unitskillmap chgmap)) :doc "Return a unit with new unitskill added to unitskillmap")
nx/tactics/books/bookloader / unit<-unit-xmlweakness
Description:
  • Return a unit with new unitweakness added to unitweaknessmap
Function Name:
  • unit<-unit-xmlweakness
Return Type:
  • nx/tactics/base/unit
Arguments:
  • Name
    Type
    Generic
    Description
    unit
    nx/tactics/base/unit
    xmlweakness
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func unit<-unit-xmlweakness : base/unit [unit : base/unit xmlweakness : xml/xml] (let : base/unit [unitweakness : base/unitweakness := (unitweakness<-xml xmlweakness) name : string := (:name unitweakness) unitweaknessmap : base/unitweaknessmap := (:unitweaknessmap unit) chgmap : base/unitweaknessmap := (copy unitweaknessmap name unitweakness)] (copy unit :unitweaknessmap chgmap)) :doc "Return a unit with new unitweakness added to unitweaknessmap")
nx/tactics/books/bookloader / unit<-xml
Description:
  • Returns a unit from a given xml.
Function Name:
  • unit<-xml
Return Type:
  • nx/tactics/base/unit
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/unit :name "name" :image "image" :titles "titles" :reference "reference" :unitskillmap (base/unitskillmap "skill1" (base/unitskill :name "skill1"))) (unit<-xml (xml/xml :tag "unit" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))) (xml/xml :tag "skill" :propmap (stringmap :name "skill1"))))))
Source Code:
  • (func unit<-xml : base/unit [xml : xml/xml] (let : base/unit [propmap : stringmap := (:propmap xml) unt : base/unit := (unit<-unit-stringmap (empty base/unit) propmap)] (any<-list-start-reduce : base/unit (:children xml) unt unit<-unit-xmlchild)) :test (test (base/unit :name "name" :image "image" :titles "titles" :reference "reference" :unitskillmap (base/unitskillmap "skill1" (base/unitskill :name "skill1"))) (unit<-xml (xml/xml :tag "unit" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))) (xml/xml :tag "skill" :propmap (stringmap :name "skill1")))))) :doc "Returns a unit from a given xml.")
nx/tactics/books/bookloader / unitability<-unitability-key-value
Description:
  • Returns a modified unitability from a key value.
Function Name:
  • unitability<-unitability-key-value
Return Type:
  • nx/tactics/base/unitability
Arguments:
  • Name
    Type
    Generic
    Description
    current
    nx/tactics/base/unitability
    key
    vx/core/string
    value
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func unitability<-unitability-key-value : base/unitability [current : base/unitability key : string value : string] (switch : base/unitability key (case "" current) (case (list "name" "image") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/unitability :prop key :value value))))) :doc "Returns a modified unitability from a key value.")
nx/tactics/books/bookloader / unitability<-unitability-stringmap
Description:
  • Returns a new unitability from a propmap.
Function Name:
  • unitability<-unitability-stringmap
Return Type:
  • nx/tactics/base/unitability
Arguments:
  • Name
    Type
    Generic
    Description
    unitability
    nx/tactics/base/unitability
    propmap
    vx/core/stringmap
Usage/Test Cases:
  • (test (base/unitability :name "name" :image "image") (unitability<-unitability-stringmap (empty base/unitability) (stringmap :name "name" :image "image")))
Source Code:
  • (func unitability<-unitability-stringmap : base/unitability [unitability : base/unitability propmap : stringmap] (any<-map-start-reduce : base/unitability propmap unitability unitability<-unitability-key-value) :test (test (base/unitability :name "name" :image "image") (unitability<-unitability-stringmap (empty base/unitability) (stringmap :name "name" :image "image"))) :doc "Returns a new unitability from a propmap.")
nx/tactics/books/bookloader / unitability<-unitability-xmlchild
Description:
  • Returns a modified unitability based on a given child xml.
Function Name:
  • unitability<-unitability-xmlchild
Return Type:
  • nx/tactics/base/unitability
Arguments:
  • Name
    Type
    Generic
    Description
    unitability
    nx/tactics/base/unitability
    child
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/unitability :titles "titles") (unitability<-unitability-xmlchild (empty base/unitability) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles")))))
Source Code:
  • (func unitability<-unitability-xmlchild : base/unitability [unitability : base/unitability child : xml/xml] (let : base/unitability [tag : string := (:tag child)] (switch : base/unitability tag (case "" unitability) (case (list "reference" "summary" "titles") (copy unitability tag (xml/string-first<-xml child))) (else (copy unitability (msg<-error :invalidtagfound (anymap :type base/unitability :tag tag)))))) :test (test (base/unitability :titles "titles") (unitability<-unitability-xmlchild (empty base/unitability) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified unitability based on a given child xml.")
nx/tactics/books/bookloader / unitability<-xml
Description:
  • Returns a unitability from a given xml.
Function Name:
  • unitability<-xml
Return Type:
  • nx/tactics/base/unitability
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/unitability :name "name" :image "image" :titles "titles" :reference "reference") (unitability<-xml (xml/xml :tag "unitability" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference")))))))
Source Code:
  • (func unitability<-xml : base/unitability [xml : xml/xml] (let : base/unitability [propmap : stringmap := (:propmap xml) unitability : base/unitability := (unitability<-unitability-stringmap (empty base/unitability) propmap)] (any<-list-start-reduce : base/unitability (:children xml) unitability unitability<-unitability-xmlchild)) :test (test (base/unitability :name "name" :image "image" :titles "titles" :reference "reference") (unitability<-xml (xml/xml :tag "unitability" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))))))) :doc "Returns a unitability from a given xml.")
nx/tactics/books/bookloader / unititem<-unititem-key-value
Description:
  • Returns a modified unititem from a key value.
Function Name:
  • unititem<-unititem-key-value
Return Type:
  • nx/tactics/base/unititem
Arguments:
  • Name
    Type
    Generic
    Description
    current
    nx/tactics/base/unititem
    key
    vx/core/string
    value
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func unititem<-unititem-key-value : base/unititem [current : base/unititem key : string value : string] (switch : base/unititem key (case "" current) (case (list "name" "image" "modifiers" "number") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/unititem :prop key :value value))))) :doc "Returns a modified unititem from a key value.")
nx/tactics/books/bookloader / unititem<-unititem-stringmap
Description:
  • Returns a new unititem from a propmap.
Function Name:
  • unititem<-unititem-stringmap
Return Type:
  • nx/tactics/base/unititem
Arguments:
  • Name
    Type
    Generic
    Description
    unititem
    nx/tactics/base/unititem
    propmap
    vx/core/stringmap
Usage/Test Cases:
  • (test (base/unititem :name "name" :image "image") (unititem<-unititem-stringmap (empty base/unititem) (stringmap :name "name" :image "image")))
Source Code:
  • (func unititem<-unititem-stringmap : base/unititem [unititem : base/unititem propmap : stringmap] (any<-map-start-reduce : base/unititem propmap unititem unititem<-unititem-key-value) :test (test (base/unititem :name "name" :image "image") (unititem<-unititem-stringmap (empty base/unititem) (stringmap :name "name" :image "image"))) :doc "Returns a new unititem from a propmap.")
nx/tactics/books/bookloader / unititem<-unititem-xmlchild
Description:
  • Returns a modified unititem based on a given child xml.
Function Name:
  • unititem<-unititem-xmlchild
Return Type:
  • nx/tactics/base/unititem
Arguments:
  • Name
    Type
    Generic
    Description
    unititem
    nx/tactics/base/unititem
    child
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/unititem :titles "titles1") (unititem<-unititem-xmlchild (empty base/unititem) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles1")))))
Source Code:
  • (func unititem<-unititem-xmlchild : base/unititem [unititem : base/unititem child : xml/xml] (let : base/unititem [tag : string := (:tag child)] (switch : base/unititem tag (case "" unititem) (case (list "reference" "summary" "titles") (copy unititem tag (xml/string-first<-xml child))) (else (copy unititem (msg<-error :invalidtagfound (anymap :type base/unititem :tag tag)))))) :test (test (base/unititem :titles "titles1") (unititem<-unititem-xmlchild (empty base/unititem) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles1"))))) :doc "Returns a modified unititem based on a given child xml.")
nx/tactics/books/bookloader / unititem<-xml
Description:
  • Returns a unititem from a given xml.
Function Name:
  • unititem<-xml
Return Type:
  • nx/tactics/base/unititem
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/unititem :name "name1" :image "image1" :titles "titles1" :reference "reference1" :summary "summary1") (unititem<-xml (xml/xml :tag "unititem" :propmap (stringmap :name "name1" :image "image1") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles1"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference1"))) (xml/xml :tag "summary" :children (xml/xmllist (xml/xml :text "summary1")))))))
Source Code:
  • (func unititem<-xml : base/unititem [xml : xml/xml] (let : base/unititem [propmap : stringmap := (:propmap xml) children : xml/xmllist := (:children xml) unititem : base/unititem := (unititem<-unititem-stringmap (empty base/unititem) propmap)] (any<-list-start-reduce : base/unititem children unititem unititem<-unititem-xmlchild)) :test (test (base/unititem :name "name1" :image "image1" :titles "titles1" :reference "reference1" :summary "summary1") (unititem<-xml (xml/xml :tag "unititem" :propmap (stringmap :name "name1" :image "image1") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles1"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference1"))) (xml/xml :tag "summary" :children (xml/xmllist (xml/xml :text "summary1"))))))) :doc "Returns a unititem from a given xml.")
nx/tactics/books/bookloader / unitpower<-unitpower-key-value
Description:
  • Returns a modified unitpower from a key value.
Function Name:
  • unitpower<-unitpower-key-value
Return Type:
  • nx/tactics/base/unitpower
Arguments:
  • Name
    Type
    Generic
    Description
    current
    nx/tactics/base/unitpower
    key
    vx/core/string
    value
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func unitpower<-unitpower-key-value : base/unitpower [current : base/unitpower key : string value : string] (switch : base/unitpower key (case "" current) (case (list "name" "image" "back" "bottom" "front" "level" "over" "side" "strength" "under") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/unitpower :prop key :value value))))) :doc "Returns a modified unitpower from a key value.")
nx/tactics/books/bookloader / unitpower<-unitpower-stringmap
Description:
  • Returns a new unitpower from a propmap.
Function Name:
  • unitpower<-unitpower-stringmap
Return Type:
  • nx/tactics/base/unitpower
Arguments:
  • Name
    Type
    Generic
    Description
    unitpower
    nx/tactics/base/unitpower
    propmap
    vx/core/stringmap
Usage/Test Cases:
Source Code:
  • (func unitpower<-unitpower-stringmap : base/unitpower [unitpower : base/unitpower propmap : stringmap] (any<-map-start-reduce propmap unitpower unitpower<-unitpower-key-value) :doc "Returns a new unitpower from a propmap.")
nx/tactics/books/bookloader / unitpower<-unitpower-xmlability
Description:
Function Name:
  • unitpower<-unitpower-xmlability
Return Type:
  • nx/tactics/base/unitpower
Arguments:
  • Name
    Type
    Generic
    Description
    unitpower
    nx/tactics/base/unitpower
    xmlability
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func unitpower<-unitpower-xmlability : base/unitpower [unitpower : base/unitpower xmlability : xml/xml] (let : base/unitpower [ability : base/unitability := (unitability<-xml xmlability) name : string := (:name ability) origmap : base/unitabilitymap := (:unitabilitymap unitpower) chgmap : base/unitabilitymap := (copy origmap name ability)] (copy unitpower :unitabilitymap chgmap)) :doc "")
nx/tactics/books/bookloader / unitpower<-unitpower-xmlchild
Description:
Function Name:
  • unitpower<-unitpower-xmlchild
Return Type:
  • nx/tactics/base/unitpower
Arguments:
  • Name
    Type
    Generic
    Description
    unitpower
    nx/tactics/base/unitpower
    child
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/unitpower :summary "summary1") (unitpower<-unitpower-xmlchild (empty base/unitpower) (xml/xml :tag "summary" :children (xml/xmllist (xml/xml :text "summary1")))))
Source Code:
  • (func unitpower<-unitpower-xmlchild : base/unitpower [unitpower : base/unitpower child : xml/xml] (let : base/unitpower [tag : string := (:tag child)] (switch : base/unitpower tag (case "" unitpower) (case (list "reference" "summary" "titles") (copy unitpower tag (xml/string-first<-xml child))) (case "ability" (unitpower<-unitpower-xmlability unitpower child)) (case "item" (unitpower<-unitpower-xmlitem unitpower child)) (case "specialty" (unitpower<-unitpower-xmlspecialty unitpower child)) (else (copy unitpower (msg<-error :invalidtagfound (anymap :type base/unitpower :tag tag)))))) :test (test (base/unitpower :summary "summary1") (unitpower<-unitpower-xmlchild (empty base/unitpower) (xml/xml :tag "summary" :children (xml/xmllist (xml/xml :text "summary1"))))) :doc "")
nx/tactics/books/bookloader / unitpower<-unitpower-xmlitem
Description:
Function Name:
  • unitpower<-unitpower-xmlitem
Return Type:
  • nx/tactics/base/unitpower
Arguments:
  • Name
    Type
    Generic
    Description
    unitpower
    nx/tactics/base/unitpower
    xmlitem
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func unitpower<-unitpower-xmlitem : base/unitpower [unitpower : base/unitpower xmlitem : xml/xml] (let : base/unitpower [item : base/unititem := (unititem<-xml xmlitem) name : string := (:name item) origmap : base/unititemmap := (:unititemmap unitpower) chgmap : base/unititemmap := (copy origmap name item)] (copy unitpower :unititemmap chgmap)) :doc "")
nx/tactics/books/bookloader / unitpower<-unitpower-xmlspecialty
Description:
Function Name:
  • unitpower<-unitpower-xmlspecialty
Return Type:
  • nx/tactics/base/unitpower
Arguments:
  • Name
    Type
    Generic
    Description
    unitpower
    nx/tactics/base/unitpower
    xmlspecialty
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func unitpower<-unitpower-xmlspecialty : base/unitpower [unitpower : base/unitpower xmlspecialty : xml/xml] (let : base/unitpower [specialty : base/unitspecialty := (unitspecialty<-xml xmlspecialty) name : string := (:name specialty) origmap : base/unitspecialtymap := (:unitspecialtymap unitpower) chgmap : base/unitspecialtymap := (copy origmap name specialty)] (copy unitpower :unitspecialtymap chgmap)) :doc "")
nx/tactics/books/bookloader / unitpower<-xml
Description:
Function Name:
  • unitpower<-xml
Return Type:
  • nx/tactics/base/unitpower
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func unitpower<-xml : base/unitpower [xml : xml/xml] (let : base/unitpower [propmap : stringmap := (:propmap xml) unitpower : base/unitpower := (unitpower<-unitpower-stringmap (empty base/unitpower) propmap)] (any<-list-start-reduce : base/unitpower (:children xml) unitpower unitpower<-unitpower-xmlchild)) :doc "")
nx/tactics/books/bookloader / unitskill<-unitskill-key-value
Description:
  • Returns a modified unitskill from a key value.
Function Name:
  • unitskill<-unitskill-key-value
Return Type:
  • nx/tactics/base/unitskill
Arguments:
  • Name
    Type
    Generic
    Description
    current
    nx/tactics/base/unitskill
    key
    vx/core/string
    value
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func unitskill<-unitskill-key-value : base/unitskill [current : base/unitskill key : string value : string] (switch : base/unitskill key (case "" current) (case (list "name" "image" "back" "bottom" "front" "level" "side" "top") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/unitskill :prop key :value value))))) :doc "Returns a modified unitskill from a key value.")
nx/tactics/books/bookloader / unitskill<-unitskill-stringmap
Description:
  • Returns a new unitskill from a propmap.
Function Name:
  • unitskill<-unitskill-stringmap
Return Type:
  • nx/tactics/base/unitskill
Arguments:
  • Name
    Type
    Generic
    Description
    unitskill
    nx/tactics/base/unitskill
    propmap
    vx/core/stringmap
Usage/Test Cases:
Source Code:
  • (func unitskill<-unitskill-stringmap : base/unitskill [unitskill : base/unitskill propmap : stringmap] (any<-map-start-reduce propmap unitskill unitskill<-unitskill-key-value) :doc "Returns a new unitskill from a propmap.")
nx/tactics/books/bookloader / unitskill<-unitskill-xmlability
Description:
Function Name:
  • unitskill<-unitskill-xmlability
Return Type:
  • nx/tactics/base/unitskill
Arguments:
  • Name
    Type
    Generic
    Description
    unitskill
    nx/tactics/base/unitskill
    xmlability
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func unitskill<-unitskill-xmlability : base/unitskill [unitskill : base/unitskill xmlability : xml/xml] (let : base/unitskill [ability : base/unitability := (unitability<-xml xmlability) name : string := (:name ability) origmap : base/unitabilitymap := (:unitabilitymap unitskill) chgmap : base/unitabilitymap := (copy origmap name ability)] (copy unitskill :unitabilitymap chgmap)) :doc "")
nx/tactics/books/bookloader / unitskill<-unitskill-xmlchild
Description:
Function Name:
  • unitskill<-unitskill-xmlchild
Return Type:
  • nx/tactics/base/unitskill
Arguments:
  • Name
    Type
    Generic
    Description
    unitskill
    nx/tactics/base/unitskill
    child
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/unitskill :summary "summary1") (unitskill<-unitskill-xmlchild (empty base/unitskill) (xml/xml :tag "summary" :children (xml/xmllist (xml/xml :text "summary1")))))
Source Code:
  • (func unitskill<-unitskill-xmlchild : base/unitskill [unitskill : base/unitskill child : xml/xml] (let : base/unitskill [tag : string := (:tag child)] (switch : base/unitskill tag (case "" unitskill) (case (list "reference" "summary" "titles") (copy unitskill tag (xml/string-first<-xml child))) (case "ability" (unitskill<-unitskill-xmlability unitskill child)) (case "item" (unitskill<-unitskill-xmlitem unitskill child)) (case "specialty" (unitskill<-unitskill-xmlspecialty unitskill child)) (else (copy unitskill (msg<-error :invalidtagfound (anymap :type base/unitskill :tag tag)))))) :test (test (base/unitskill :summary "summary1") (unitskill<-unitskill-xmlchild (empty base/unitskill) (xml/xml :tag "summary" :children (xml/xmllist (xml/xml :text "summary1"))))) :doc "")
nx/tactics/books/bookloader / unitskill<-unitskill-xmlitem
Description:
Function Name:
  • unitskill<-unitskill-xmlitem
Return Type:
  • nx/tactics/base/unitskill
Arguments:
  • Name
    Type
    Generic
    Description
    unitskill
    nx/tactics/base/unitskill
    xmlitem
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func unitskill<-unitskill-xmlitem : base/unitskill [unitskill : base/unitskill xmlitem : xml/xml] (let : base/unitskill [item : base/unititem := (unititem<-xml xmlitem) name : string := (:name item) origmap : base/unititemmap := (:unititemmap unitskill) chgmap : base/unititemmap := (copy origmap name item)] (copy unitskill :unititemmap chgmap)) :doc "")
nx/tactics/books/bookloader / unitskill<-unitskill-xmlspecialty
Description:
Function Name:
  • unitskill<-unitskill-xmlspecialty
Return Type:
  • nx/tactics/base/unitskill
Arguments:
  • Name
    Type
    Generic
    Description
    unitskill
    nx/tactics/base/unitskill
    xmlspecialty
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func unitskill<-unitskill-xmlspecialty : base/unitskill [unitskill : base/unitskill xmlspecialty : xml/xml] (let : base/unitskill [specialty : base/unitspecialty := (unitspecialty<-xml xmlspecialty) name : string := (:name specialty) origmap : base/unitspecialtymap := (:unitspecialtymap unitskill) chgmap : base/unitspecialtymap := (copy origmap name specialty)] (copy unitskill :unitspecialtymap chgmap)) :doc "")
nx/tactics/books/bookloader / unitskill<-xml
Description:
Function Name:
  • unitskill<-xml
Return Type:
  • nx/tactics/base/unitskill
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func unitskill<-xml : base/unitskill [xml : xml/xml] (let : base/unitskill [propmap : stringmap := (:propmap xml) unitskill : base/unitskill := (unitskill<-unitskill-stringmap (empty base/unitskill) propmap)] (any<-list-start-reduce : base/unitskill (:children xml) unitskill unitskill<-unitskill-xmlchild)) :doc "")
nx/tactics/books/bookloader / unitspecialty<-unitspecialty-key-value
Description:
  • Returns a modified unitspecialty from a key value.
Function Name:
  • unitspecialty<-unitspecialty-key-value
Return Type:
  • nx/tactics/base/unitspecialty
Arguments:
  • Name
    Type
    Generic
    Description
    current
    nx/tactics/base/unitspecialty
    key
    vx/core/string
    value
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func unitspecialty<-unitspecialty-key-value : base/unitspecialty [current : base/unitspecialty key : string value : string] (switch : base/unitspecialty key (case "" current) (case (list "name" "image") (copy current key value)) (else (copy current (msg<-error :invalidproperty (anymap :type base/unitspecialty :prop key :value value))))) :doc "Returns a modified unitspecialty from a key value.")
nx/tactics/books/bookloader / unitspecialty<-unitspecialty-stringmap
Description:
  • Returns a new unitspecialty from a propmap.
Function Name:
  • unitspecialty<-unitspecialty-stringmap
Return Type:
  • nx/tactics/base/unitspecialty
Arguments:
  • Name
    Type
    Generic
    Description
    unitspecialty
    nx/tactics/base/unitspecialty
    propmap
    vx/core/stringmap
Usage/Test Cases:
  • (test (base/unitspecialty :name "name" :image "image") (unitspecialty<-unitspecialty-stringmap (empty base/unitspecialty) (stringmap :name "name" :image "image")))
Source Code:
  • (func unitspecialty<-unitspecialty-stringmap : base/unitspecialty [unitspecialty : base/unitspecialty propmap : stringmap] (any<-map-start-reduce : base/unitspecialty propmap unitspecialty unitspecialty<-unitspecialty-key-value) :test (test (base/unitspecialty :name "name" :image "image") (unitspecialty<-unitspecialty-stringmap (empty base/unitspecialty) (stringmap :name "name" :image "image"))) :doc "Returns a new unitspecialty from a propmap.")
nx/tactics/books/bookloader / unitspecialty<-unitspecialty-xmlchild
Description:
  • Returns a modified unitspecialty based on a given child xml.
Function Name:
  • unitspecialty<-unitspecialty-xmlchild
Return Type:
  • nx/tactics/base/unitspecialty
Arguments:
  • Name
    Type
    Generic
    Description
    unitspecialty
    nx/tactics/base/unitspecialty
    child
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/unitspecialty :titles "titles") (unitspecialty<-unitspecialty-xmlchild (empty base/unitspecialty) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles")))))
Source Code:
  • (func unitspecialty<-unitspecialty-xmlchild : base/unitspecialty [unitspecialty : base/unitspecialty child : xml/xml] (let : base/unitspecialty [tag : string := (:tag child)] (switch : base/unitspecialty tag (case "" unitspecialty) (case (list "reference" "summary" "titles") (copy unitspecialty tag (xml/string-first<-xml child))) (else (copy unitspecialty (msg<-error :invalidtagfound (anymap :type base/unitspecialty :tag tag)))))) :test (test (base/unitspecialty :titles "titles") (unitspecialty<-unitspecialty-xmlchild (empty base/unitspecialty) (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))))) :doc "Returns a modified unitspecialty based on a given child xml.")
nx/tactics/books/bookloader / unitspecialty<-xml
Description:
  • Returns a unitspecialty from a given xml.
Function Name:
  • unitspecialty<-xml
Return Type:
  • nx/tactics/base/unitspecialty
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
  • (test (base/unitspecialty :name "name" :image "image" :titles "titles" :reference "reference") (unitspecialty<-xml (xml/xml :tag "unitspecialty" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference")))))))
Source Code:
  • (func unitspecialty<-xml : base/unitspecialty [xml : xml/xml] (let : base/unitspecialty [propmap : stringmap := (:propmap xml) unitspecialty : base/unitspecialty := (unitspecialty<-unitspecialty-stringmap (empty base/unitspecialty) propmap)] (any<-list-start-reduce : base/unitspecialty (:children xml) unitspecialty unitspecialty<-unitspecialty-xmlchild)) :test (test (base/unitspecialty :name "name" :image "image" :titles "titles" :reference "reference") (unitspecialty<-xml (xml/xml :tag "unitspecialty" :propmap (stringmap :name "name" :image "image") :children (xml/xmllist (xml/xml :tag "titles" :children (xml/xmllist (xml/xml :text "titles"))) (xml/xml :tag "reference" :children (xml/xmllist (xml/xml :text "reference"))))))) :doc "Returns a unitspecialty from a given xml.")
nx/tactics/books/bookloader / unitweakness<-xml
Description:
Function Name:
  • unitweakness<-xml
Return Type:
  • nx/tactics/base/unitweakness
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func unitweakness<-xml : base/unitweakness [xml : xml/xml])
nx/tactics/books/bookloader / weakness<-xml
Description:
Function Name:
  • weakness<-xml
Return Type:
  • nx/tactics/base/weakness
Arguments:
  • Name
    Type
    Generic
    Description
    xml
    vx/data/xml/xml
Usage/Test Cases:
Source Code:
  • (func weakness<-xml : base/weakness [xml : xml/xml])
nx/tactics/books/bookloader / xml-read<-bookname
Description:
  • Returns an xml from a file with bookname.
Function Name:
  • xml-read<-bookname
Return Type:
  • vx/data/xml/xml
Arguments:
  • Name
    Type
    Generic
    Description
    bookname
    vx/core/string
Usage/Test Cases:
Source Code:
  • (func xml-read<-bookname : xml/xml [bookname : string] (xml/xml-read<-file (file-read<-bookname bookname)) :context :doc "Returns an xml from a file with bookname.")
nx/tactics/books/characters
Description:
Package Name:
  • nx/tactics/books/characters
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
Functions:
  • tacticsbook
Source Code:
  • (package nx/tactics/books/characters :libs (lib base :path nx/tactics/base)) (func tacticsbook : base/book (book :name "Characters" :image "Characters.jpg" :chaptermap (chaptermap "Characters Overview" (chapter :name "Characters Overview" :sectionmap (sectionmap "Why Tactics: Characters and Stories?" (section :name "Why Tactics: Characters and Stories?"))) "Creating Characters" (chapter :name "Creating Characters" :summary "* Attributes * Skills * Equipment * Personality * History * Friends and Family ** Dependents * Enemies ** Hunted" :sectionmap (sectionmap :Personalities (section :name "Personalities" :summary "Positive * Adventurous - Someone who is adventurous enjoys adventure and takes risks. * Affectionate - Someone who is affectionate shows their love for other people. * Ambitious - A person who is ambitious wants to be successful in their career, studies, sport. * Brave - A brave person wants to do difficult or challenging things and is not afraid. * Chatty - Someone who is chatty enjoys talking to other people a lot. * Cheerful - A cheerful person smiles a lot and is happy. * Confident - Confident people feel sure about their own ability and present themselves well to other people. * Creative - Someone who is creative is very good at designing or making things. * Determined - A determined person makes a definite decision and does not give up. * Easy-going - Someone who is easy-going is quite relaxed and accepts things as they are. * Enthusiastic - Someone who is enthusiastic shows lots of interest in something and is very positive about it. * Frank - Someone who is frank is honest and direct in what they say. * Friendly - A friendly person always talks to other people and perhaps helps them too. * Funny - Someone who is funny makes people laugh. * Generous - A generous person is kind to other people, may give presents or lend money. * Hard-working - Someone who is hard working always puts a lot of effort into their work. * Helpful - A helpful person is always happy to help other people. * Honest - An honest person tells the truth and never steals or cheats. * Imaginative - An imaginative person has good ideas or is good at creating stories or artwork. * Intelligent - Someone who is intelligent is good at learning. This person may think about things in a logical way. * Kind - A kind person cares about other people and behaves positively towards them. * Loyal - Someone who is loyal will always support his or her friends. * Meticulous - A meticulous person pays careful attention to detail, probably has a tidy house and neat handwriting! * Modest - Someone who is modest does not show off about his or her abilities or possessions. * Optimistic - An optimistic person has a positive view of life and expects good things to happen. * Outgoing - An outgoing person is very sociable. * Patient - Someone who is patient does not get annoyed or frustrated easily and has time for other people. * Reliable - A person who is reliable can always be trusted to do what is required. * Sensible - A person who is sensible makes decisions based on reason/logic, does not take risks. * Sensitive - A sensitive person is very aware of other people’s feelings, can be easily hurt emotionally * Sincere - A sincere person is honest in their relationships with others and says what they think or feel. * Sociable - Someone who is sociable loves chatting with other people. * Sympathetic - Someone who is sympathetic understands other people’s problems very well. * Thoughtful - Someone who is thoughtful always thinks of other people, remembers birthdays and sends a card! * Trustworthy - A trustworthy person is someone you can rely on to be honest. Negative * Arrogant - An arrogant person thinks they are very important and behaves in a overly proud way. * Big-headed - Someone who is big-headed talks a lot about how good they are, this person is too proud. * Bossy - A bossy person is always telling other people what to do. * Childish - Someone who is childish is silly or behaves like a child when they should behave like an adult. * Clumsy - A clumsy person knocks things over a lot and is not careful. * Cruel - Someone who is cruel is extremely unkind to other people or animals. * Defensive - Someone who is defensive behaves in a way that suggests they believe other people are criticising them. * Dishonest - A dishonest person tells lies or tricks other people. * Fussy - A fussy person wants everything to be done in a particular way, they are picky/choosy. * Grumpy - Someone who is grumpy is easily annoyed, in a bad mood. * Gullible - It is easy to trick someone who is gullible. This person believes something that most people would not believe, being naive * Impolite - An impolite person is rude. * Inconsiderate - Someone who is inconsiderate does not think about other people, quite selfish. * Indecisive - An indecisive person finds it difficult to make decisions. * Inflexible - Someone who is inflexible is unwilling to change their opinion or the way they do things. * Insecure - An insecure person does not have confidence in themselves or their relationship with other people. * Jealous - A jealous person feels angry or unhappy because they wish they had something that somebody else has. * Lazy - A lazy person does not work hard. * Mean - Someone who is mean is unkind. * Moody - A moody person is bad-tempered or has frequent mood changes. * Narrow-minded - A narrow-minded person is not willing to listen to the ideas or opinions of others. * Nasty - A nasty person is very unkind. * Pessimistic - Someone who is pessimistic has a negative view of the future and expects bad things to happen. * Pretentious - Someone who tries to look or sound more important or clever than they are. * Rebellious - Someone who is rebellious does not follow the rules. * Rude - A rude person is not polite or does not respect other people. * Quick-tempered - Someone who is quick-tempered becomes angry very easily. * Self-centered - A person who is self-centred only thinks about himself or herself. * Selfish - Selfish people think only about themselves and not about other people. * Stubborn - Someone who is stubborn does not easily change their mind. * Sulky - If someone is sulky they show their bad mood by not speaking. * Tactless - A tactless person does not show sensitivity to others in what they say, not diplomatic. * Unpleasant - An unpleasant person is not nice. * Unreliable - An unreliable person cannot be trusted or relied upon. * Vain - Someone who is vain is too concerned about their appearance or abilities."))) "Character Archetypes" (chapter :name "Character Archetypes" :summary "* Antihero * Bad Boy * Bumpkin * Coutier - Politics, Etiquette, Psychology, Fashion * Crafter * Damsel * Fatalist - Nihilist * Fool * Grotesque * Hermit * Knight in Shining Armor * Mysterious * Orchid - Pampered Life * Outlaw * Peacock - Showoff * Rake - Pleasure seeker * Regent - Leader * Rogue * Sage * Saint * Savage * Trickster - Riddler * Troubadour * Wayfarer - Wanderer * Wretch" :sectionmap (sectionmap "Wizard Classes" (section :name "Wizard Classes" :unitmap (unitmap :Alchemist (unit :name "Alchemist") :Artificer (unit :name "Artificer") :Elementalist (unit :name "Elementalist" :summary "* Preferred Skills: Elemental Magic") :Necromancer (unit :name "Necromancer") :Sorceror (unit :name "Sorceror") :Wizard (unit :name "Wizard"))))) :Storytelling (chapter :name "Storytelling" :summary "* As Storyteller you're part artist, part writer, and mostly editor. You design the overall plots and subplots, draw out the backgrounds, design the greater part of the cast and improvise dialog as the story goes. By describing the world around them, you help to define the characters. Daunting? Sure. But it's not as impossible as it sounds. * Don't try to win. Tell a story - Storytelling isn't about winning and losing. It is about drama and interaction. Trying to meet objectives is just a device to achieve drama. A story may be more interesting if the objective is failed. * Players are not your opponents - It is important to remember that the players and storyteller are both responsible for creating an interesting story. * Don't try to maintain control - Instead of a detailed plot, try to create detailed situations that will play out without the characters' involvement. Then let the players make their own decisions. The storyteller sets up the situation and the sets and props. The players do the acting. Test yourself by not talking every once in a while and listen to the players. If they go silent waiting for you, then something is wrong. If they are deeply interacting with one another and haven't noticed your silence, you are doing it right. * Understand the Players - Some play to gain a sense of power, others for the social aspects of being with friends, and others as a means of wish fulfillment. Some prefer fighting deadly foes, others prefer puzzles and riddles, others simply enjoy talking in character and engaging in political infighting or witty repartee. All of these desires must be juggled and given some space in the game. Some players are vocal and aggressive while others are shy or have trouble putting their ideas into words. * Offer Variety - Luckily juggling different player needs provides variety and a change of pace. Switching from action to drama to tragedy to comedy provides depth and realism to the story. Life never stays the same after all. Be sure to vary the focus of the game onto each player. Some players will regularly take the focus themselves while you must steer the story toward other players by allowing them to notice things the busier players miss or by revolving plot points around skills or special knowledge that only some players possess. If players become bored, the story will die." :sectionmap (sectionmap "Character Scenarios" (section :name "Character Scenarios" :scenariomap (scenariomap "Personal Quest" (scenario :name "Personal Quest" :summary "* These are usually intense stories deeply rooted in the desires and emotions of the characters. * Revenge, atonement, love, family obligations. * Quests drive characters beyond the bounds of propriety and moderation. Failed questors create some of the most classic villains (e.g. Darth Vader).") :Missions (scenario :name "Missions" :summary "* Missions usually begin as impersonal tasks assigned by someone else, probably to fulfill an agenda other than the character's own. Missions are rarely what they seem at the beginning and have a tendency to evolve into something more personal. * Often a character's agenda becomes at odds with the mission, and he/she must make some decisions about where they stand. * Some Missions require a certain amount of detective work before or during the Mission to discover the true goals and motivations behind the Mission.") "Damage Control Mission" (scenario :name "Damage Control Mission" :summary "* A specific form of Mission where a situation has already spun out of control and the characters are dispatched to 'fix' the situation. * Damage Control missions tend to be fast-paced with a rapidly deteriorating situation.") "Training Mission" (scenario :name "Training Mission" :summary "* Training scenarios can take many forms. They can put the characters in the position of student, teacher, or both. * Training can appear as another sort of scenario but has been carefully staged by the teacher. Or Training can spiral out of control and become a life or death struggle. * Training is also a convenient plot device to gather unrelated characters together.") "Disaster Mission" (scenario :name "Disaster Mission" :summary "* Sometimes bad things just happen. Suddenly, the characters are torn from their comfort zone and thrust into a new perspective. Disasters can be sever enough to create temporary alliances among enemies."))))) :Sets (chapter :name "Sets" :sectionmap (sectionmap :Settlement (section :name "Settlement" :summary "* Settlement Level describes the general size of a settlement. It determines the level of resources that can be bought and sold and the availability of exotic resources. Titles * Nomadic Tribe - Level 1 * Town - Level 4 * Large Town - Level 6 * Small City - Level 8 * City - Level 10 * Metropolis - Level 12 * Urban Sprawl - Level 14 * Planetary Sprawl - Level 16 * Galactic Empire - Level 20"))) :Props (chapter :name "Props") :Cast (chapter :name "Cast" :sectionmap (sectionmap "Stock Characters" (section :name "Stock Characters" :summary "* Boy Scout - How can a corrupt police force uphold justice? * Devoted Sidekick - You're going to need help, and I'm coming with you. * Elitist - We're the ones who matter and everyone else can go to hell! * Femme Fatale - I'm not very good at flirting. I don't usually talk to men unless I'm really interested. ** All curves inside and out, there's nothing simple about the Femme Fatale. At times bold and brassy, other times vulnerable and frightened, she's always in control and always utterly deadly, but most victims don't realize until it is too late. * Hard Nosed Cop - I don't care if the cuffs are too tight. They're supposed to be. * Has-Been - I used to be able to do that, but I haven't tried in years. * Manipulator * Innocent Victim - My shop...my house! How am I going to live? That thing took everything I had. * Inscrutable Stranger * Not-So-Innocent Victim - I didn't mean I would ACTUALLY kill him. It was a figure of speech! And now look what he did! Who is going to pay for this? * Lover - Come home in one piece, ok? I love you. * Plucky Bystander - What the hell was that? Nevermind. Hey, you're bleeding. Wrap this around your arm and keep pressure on it. I'll watch the door, ok? * Rival * Seducer - Come on, you can get away for one night. You have to see this place. It's stunning, and the people! So friendly. It's just something you have to see. * Smooth Talker - I could call the super for the key. I'm sure he won't mind coming in at this hour. He is a kind old man even if the stroke did change him. * Sullen Detective - Leave him here. A loser like him'll get picked up for something eventually. * Thrill-Seeker - Here, try this: First throw the parachute out, count to five, then jump out after it, without a jumpsuit! * Turncoat - I informed the Supervisor that progress is virtually nonexistant. He was very impressed with my proposal to get things back on schedule. He should be here momentarily to discuss it."))))))
nx/tactics/books/characters / tacticsbook
Description:
Function Name:
  • tacticsbook
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func tacticsbook : base/book (book :name "Characters" :image "Characters.jpg" :chaptermap (chaptermap "Characters Overview" (chapter :name "Characters Overview" :sectionmap (sectionmap "Why Tactics: Characters and Stories?" (section :name "Why Tactics: Characters and Stories?"))) "Creating Characters" (chapter :name "Creating Characters" :summary "* Attributes * Skills * Equipment * Personality * History * Friends and Family ** Dependents * Enemies ** Hunted" :sectionmap (sectionmap :Personalities (section :name "Personalities" :summary "Positive * Adventurous - Someone who is adventurous enjoys adventure and takes risks. * Affectionate - Someone who is affectionate shows their love for other people. * Ambitious - A person who is ambitious wants to be successful in their career, studies, sport. * Brave - A brave person wants to do difficult or challenging things and is not afraid. * Chatty - Someone who is chatty enjoys talking to other people a lot. * Cheerful - A cheerful person smiles a lot and is happy. * Confident - Confident people feel sure about their own ability and present themselves well to other people. * Creative - Someone who is creative is very good at designing or making things. * Determined - A determined person makes a definite decision and does not give up. * Easy-going - Someone who is easy-going is quite relaxed and accepts things as they are. * Enthusiastic - Someone who is enthusiastic shows lots of interest in something and is very positive about it. * Frank - Someone who is frank is honest and direct in what they say. * Friendly - A friendly person always talks to other people and perhaps helps them too. * Funny - Someone who is funny makes people laugh. * Generous - A generous person is kind to other people, may give presents or lend money. * Hard-working - Someone who is hard working always puts a lot of effort into their work. * Helpful - A helpful person is always happy to help other people. * Honest - An honest person tells the truth and never steals or cheats. * Imaginative - An imaginative person has good ideas or is good at creating stories or artwork. * Intelligent - Someone who is intelligent is good at learning. This person may think about things in a logical way. * Kind - A kind person cares about other people and behaves positively towards them. * Loyal - Someone who is loyal will always support his or her friends. * Meticulous - A meticulous person pays careful attention to detail, probably has a tidy house and neat handwriting! * Modest - Someone who is modest does not show off about his or her abilities or possessions. * Optimistic - An optimistic person has a positive view of life and expects good things to happen. * Outgoing - An outgoing person is very sociable. * Patient - Someone who is patient does not get annoyed or frustrated easily and has time for other people. * Reliable - A person who is reliable can always be trusted to do what is required. * Sensible - A person who is sensible makes decisions based on reason/logic, does not take risks. * Sensitive - A sensitive person is very aware of other people’s feelings, can be easily hurt emotionally * Sincere - A sincere person is honest in their relationships with others and says what they think or feel. * Sociable - Someone who is sociable loves chatting with other people. * Sympathetic - Someone who is sympathetic understands other people’s problems very well. * Thoughtful - Someone who is thoughtful always thinks of other people, remembers birthdays and sends a card! * Trustworthy - A trustworthy person is someone you can rely on to be honest. Negative * Arrogant - An arrogant person thinks they are very important and behaves in a overly proud way. * Big-headed - Someone who is big-headed talks a lot about how good they are, this person is too proud. * Bossy - A bossy person is always telling other people what to do. * Childish - Someone who is childish is silly or behaves like a child when they should behave like an adult. * Clumsy - A clumsy person knocks things over a lot and is not careful. * Cruel - Someone who is cruel is extremely unkind to other people or animals. * Defensive - Someone who is defensive behaves in a way that suggests they believe other people are criticising them. * Dishonest - A dishonest person tells lies or tricks other people. * Fussy - A fussy person wants everything to be done in a particular way, they are picky/choosy. * Grumpy - Someone who is grumpy is easily annoyed, in a bad mood. * Gullible - It is easy to trick someone who is gullible. This person believes something that most people would not believe, being naive * Impolite - An impolite person is rude. * Inconsiderate - Someone who is inconsiderate does not think about other people, quite selfish. * Indecisive - An indecisive person finds it difficult to make decisions. * Inflexible - Someone who is inflexible is unwilling to change their opinion or the way they do things. * Insecure - An insecure person does not have confidence in themselves or their relationship with other people. * Jealous - A jealous person feels angry or unhappy because they wish they had something that somebody else has. * Lazy - A lazy person does not work hard. * Mean - Someone who is mean is unkind. * Moody - A moody person is bad-tempered or has frequent mood changes. * Narrow-minded - A narrow-minded person is not willing to listen to the ideas or opinions of others. * Nasty - A nasty person is very unkind. * Pessimistic - Someone who is pessimistic has a negative view of the future and expects bad things to happen. * Pretentious - Someone who tries to look or sound more important or clever than they are. * Rebellious - Someone who is rebellious does not follow the rules. * Rude - A rude person is not polite or does not respect other people. * Quick-tempered - Someone who is quick-tempered becomes angry very easily. * Self-centered - A person who is self-centred only thinks about himself or herself. * Selfish - Selfish people think only about themselves and not about other people. * Stubborn - Someone who is stubborn does not easily change their mind. * Sulky - If someone is sulky they show their bad mood by not speaking. * Tactless - A tactless person does not show sensitivity to others in what they say, not diplomatic. * Unpleasant - An unpleasant person is not nice. * Unreliable - An unreliable person cannot be trusted or relied upon. * Vain - Someone who is vain is too concerned about their appearance or abilities."))) "Character Archetypes" (chapter :name "Character Archetypes" :summary "* Antihero * Bad Boy * Bumpkin * Coutier - Politics, Etiquette, Psychology, Fashion * Crafter * Damsel * Fatalist - Nihilist * Fool * Grotesque * Hermit * Knight in Shining Armor * Mysterious * Orchid - Pampered Life * Outlaw * Peacock - Showoff * Rake - Pleasure seeker * Regent - Leader * Rogue * Sage * Saint * Savage * Trickster - Riddler * Troubadour * Wayfarer - Wanderer * Wretch" :sectionmap (sectionmap "Wizard Classes" (section :name "Wizard Classes" :unitmap (unitmap :Alchemist (unit :name "Alchemist") :Artificer (unit :name "Artificer") :Elementalist (unit :name "Elementalist" :summary "* Preferred Skills: Elemental Magic") :Necromancer (unit :name "Necromancer") :Sorceror (unit :name "Sorceror") :Wizard (unit :name "Wizard"))))) :Storytelling (chapter :name "Storytelling" :summary "* As Storyteller you're part artist, part writer, and mostly editor. You design the overall plots and subplots, draw out the backgrounds, design the greater part of the cast and improvise dialog as the story goes. By describing the world around them, you help to define the characters. Daunting? Sure. But it's not as impossible as it sounds. * Don't try to win. Tell a story - Storytelling isn't about winning and losing. It is about drama and interaction. Trying to meet objectives is just a device to achieve drama. A story may be more interesting if the objective is failed. * Players are not your opponents - It is important to remember that the players and storyteller are both responsible for creating an interesting story. * Don't try to maintain control - Instead of a detailed plot, try to create detailed situations that will play out without the characters' involvement. Then let the players make their own decisions. The storyteller sets up the situation and the sets and props. The players do the acting. Test yourself by not talking every once in a while and listen to the players. If they go silent waiting for you, then something is wrong. If they are deeply interacting with one another and haven't noticed your silence, you are doing it right. * Understand the Players - Some play to gain a sense of power, others for the social aspects of being with friends, and others as a means of wish fulfillment. Some prefer fighting deadly foes, others prefer puzzles and riddles, others simply enjoy talking in character and engaging in political infighting or witty repartee. All of these desires must be juggled and given some space in the game. Some players are vocal and aggressive while others are shy or have trouble putting their ideas into words. * Offer Variety - Luckily juggling different player needs provides variety and a change of pace. Switching from action to drama to tragedy to comedy provides depth and realism to the story. Life never stays the same after all. Be sure to vary the focus of the game onto each player. Some players will regularly take the focus themselves while you must steer the story toward other players by allowing them to notice things the busier players miss or by revolving plot points around skills or special knowledge that only some players possess. If players become bored, the story will die." :sectionmap (sectionmap "Character Scenarios" (section :name "Character Scenarios" :scenariomap (scenariomap "Personal Quest" (scenario :name "Personal Quest" :summary "* These are usually intense stories deeply rooted in the desires and emotions of the characters. * Revenge, atonement, love, family obligations. * Quests drive characters beyond the bounds of propriety and moderation. Failed questors create some of the most classic villains (e.g. Darth Vader).") :Missions (scenario :name "Missions" :summary "* Missions usually begin as impersonal tasks assigned by someone else, probably to fulfill an agenda other than the character's own. Missions are rarely what they seem at the beginning and have a tendency to evolve into something more personal. * Often a character's agenda becomes at odds with the mission, and he/she must make some decisions about where they stand. * Some Missions require a certain amount of detective work before or during the Mission to discover the true goals and motivations behind the Mission.") "Damage Control Mission" (scenario :name "Damage Control Mission" :summary "* A specific form of Mission where a situation has already spun out of control and the characters are dispatched to 'fix' the situation. * Damage Control missions tend to be fast-paced with a rapidly deteriorating situation.") "Training Mission" (scenario :name "Training Mission" :summary "* Training scenarios can take many forms. They can put the characters in the position of student, teacher, or both. * Training can appear as another sort of scenario but has been carefully staged by the teacher. Or Training can spiral out of control and become a life or death struggle. * Training is also a convenient plot device to gather unrelated characters together.") "Disaster Mission" (scenario :name "Disaster Mission" :summary "* Sometimes bad things just happen. Suddenly, the characters are torn from their comfort zone and thrust into a new perspective. Disasters can be sever enough to create temporary alliances among enemies."))))) :Sets (chapter :name "Sets" :sectionmap (sectionmap :Settlement (section :name "Settlement" :summary "* Settlement Level describes the general size of a settlement. It determines the level of resources that can be bought and sold and the availability of exotic resources. Titles * Nomadic Tribe - Level 1 * Town - Level 4 * Large Town - Level 6 * Small City - Level 8 * City - Level 10 * Metropolis - Level 12 * Urban Sprawl - Level 14 * Planetary Sprawl - Level 16 * Galactic Empire - Level 20"))) :Props (chapter :name "Props") :Cast (chapter :name "Cast" :sectionmap (sectionmap "Stock Characters" (section :name "Stock Characters" :summary "* Boy Scout - How can a corrupt police force uphold justice? * Devoted Sidekick - You're going to need help, and I'm coming with you. * Elitist - We're the ones who matter and everyone else can go to hell! * Femme Fatale - I'm not very good at flirting. I don't usually talk to men unless I'm really interested. ** All curves inside and out, there's nothing simple about the Femme Fatale. At times bold and brassy, other times vulnerable and frightened, she's always in control and always utterly deadly, but most victims don't realize until it is too late. * Hard Nosed Cop - I don't care if the cuffs are too tight. They're supposed to be. * Has-Been - I used to be able to do that, but I haven't tried in years. * Manipulator * Innocent Victim - My shop...my house! How am I going to live? That thing took everything I had. * Inscrutable Stranger * Not-So-Innocent Victim - I didn't mean I would ACTUALLY kill him. It was a figure of speech! And now look what he did! Who is going to pay for this? * Lover - Come home in one piece, ok? I love you. * Plucky Bystander - What the hell was that? Nevermind. Hey, you're bleeding. Wrap this around your arm and keep pressure on it. I'll watch the door, ok? * Rival * Seducer - Come on, you can get away for one night. You have to see this place. It's stunning, and the people! So friendly. It's just something you have to see. * Smooth Talker - I could call the super for the key. I'm sure he won't mind coming in at this hour. He is a kind old man even if the stroke did change him. * Sullen Detective - Leave him here. A loser like him'll get picked up for something eventually. * Thrill-Seeker - Here, try this: First throw the parachute out, count to five, then jump out after it, without a jumpsuit! * Turncoat - I informed the Supervisor that progress is virtually nonexistant. He was very impressed with my proposal to get things back on schedule. He should be here momentarily to discuss it."))))))
nx/tactics/books/combat
Description:
Package Name:
  • nx/tactics/books/combat
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
Functions:
  • tacticsbook
Source Code:
  • (package nx/tactics/books/combat :libs (lib base :path nx/tactics/base)) (func tacticsbook : base/book (book :name "Combat" :image "Warrior.jpg" :chaptermap (chaptermap "Combat Overview" (chapter :name "Combat Overview" :sectionmap (sectionmap "Aiming and Range" (section :name "Aiming and Range" :summary "* It takes 3 seconds to aim a weapon at a target. * Range - Each 50m range takes an additional 1 second to aim. Pistols incur -1 Attack per 50m. Rifles incur -1 Attack per 100m. * Aiming with a Scope - Using a scope triples the aim time and the effective range."))) "Example of Play" (chapter :name "Example of Play" :sectionmap (sectionmap "Street Fight" (section :name "Street Fight"))) :Rules (chapter :name "Rules" :sectionmap (sectionmap "Weapon Rules" (section :name "Weapon Rules" :rulemap (rulemap "Firing Arc" (rule :name "Firing Arc" :summary "Larger weapons are often cumbersome to use or aim and may only attack in a particular arc. The following abbreviations are used: * F - Front. Can only attach in any front arc. * B - Back. Can only attack in any rear arc. * FF - Fixed Forward. Can only attack the forward arc. * FB - Fixed Backward. Can only attack the rear arc. * FL - Fixed Left. Can only attack the left arc. * FR - Fixed Right. Can only attack the right arc. * Turrent - Turret mount. Can attack in any direction but must use [Turret] rules to fire anywhere but forward. * Pintle - Pintle mount. Can attack in any direction without limit, but if the pintle mount is used, a crew member is exposed and may be targetted separately from the vehicle at -1.") :Reload (rule :name "Reload" :summary "* [Action]: An item with Reload may not be used until all Reload tokens are removed. * [Action]: An item with Reload adds the number of Reload tokens each time the item is used. * Gain a White [Reload] Token for each Reload value each time the weapon is fired. 1. Panther G 13 sec 2. PZ IV F1 9 sec 3. PZ IV F2 10 sec 4. Tiger 1E 15 sec 5. IS-2 20 sec - This is longer due to the IS-2 having a 122mm cannon and the shell has to be loaded in two parts. Although the first shot to a Panther, Tiger or a PZ IV is usally fatal. 6. KV-1S 12 sec 7. T34-76 13 sec") "Shoot From The Hip" (rule :name "Shoot From The Hip" :summary "* Any unit shooting from the hip takes -1 Attack."))))) :Skills (chapter :name "Skills" :sectionmap (sectionmap "Combat Skills" (section :name "Combat Skills" :skillmap (skillmap :Defend (skill :name "Defend" :titles "Armorer, Defender, Shield Bearer, Shield Warden, Warder" :stat "Body" :abilitymap (abilitymap :Armorsmithing (ability :name "Armorsmithing" :summary "* The ability to repair, improve, or even create armor.") :Counterattack (ability :name "Counterattack") "High Block" (ability :name "High Block" :summary "-1 Speed +4 Defense vs. [High Attack] +1 Defense vs. other attacks") "Low Block" (ability :name "Low Block" :summary "-1 Speed +4 Defense vs. [Low Attack] +1 Defense vs. other attacks") "Powered Armor" (ability :name "Powered Armor") "Shield Bash" (ability :name "Shield Bash") "Shield Block" (ability :name "Shield Block" :summary "* [Defend] [Damage]: Add Shield [Armor] to your [Armor].") "Shield Charge" (ability :name "Shield Charge") "Shield Guard" (ability :name "Shield Guard" :summary "* [Reaction] [Damage]: Before adjacent unit takes damage, discard a [Club] to add your Shield [Armor].") "Shield Sacrifice" (ability :name "Shield Sacrifice" :summary "* [Club] [Defend] [Damage]: The shield becomes the target of any [Overwhelm] damage.")) :specialtymap (specialtymap "Medium Armor" (specialty :name "Medium Armor") "Heavy Armor" (specialty :name "Heavy Armor") :Shields (specialty :name "Shields"))) "Close Combat" (skill :name "Close Combat" :reference "* The usefulness of kicks in self-defense and actual combat has been debated. Kicks are powerful but risk balance, expose the groin, and risk take downs. * Joker, there is nothing wrong with you that I can't fix. With my hands. - Batman, The Dark Knight Returns * There are seven working defenses from this position. Three of them disarm with minimal contact, three of them kill. The other....hurts. - Batman, The Dark Knight Returns * Beat losers, get paid. - Sett, Runeterra" :summary "* [Targeting]: Close combat may only be used to attack the space directly ahead or the space you are on. * The baseline for kicking abilities is that they are -1 Speed and +1 Damage with a minor special ability. NAME SPD DMG MV DEF SHORT KICK + 1 + 0 + 0 S,C,A FORWARD KICK + 0 + 2 -- 1 S,C,A ---------------------------------------------------------------------------------------------------------------------------------- BACK ROUNDHOUSE -- 2 + 2 -- 1 None K2 * Ignores all Blocks except for San He and Evade Blow. *CARTWHEEL KICK -- 1 -- 1 + 0 S,C (2 W) K4, A3 * DMG vs. all adjacent hexes; opponents who take DMG are Knocked Back one hex; Straight Line attack; the fighter may use full MV, dealing DMG each time he moves next to an opponent. CRESCENT KICK -- 1 + 4 -- 2 S, miss C K3 * KDA DESCENDING WHEEL KICK -- 2 +3 (x2) + 0 (Special) (1 W) K4, A3, Jump, Ft.Swp * First hit = Aerial, Block- S, miss C; Second hit = Crouching, KD, Block- C, miss A. FOOT SWEEP -- 2 + 3 -- 2 C, miss A K2, Crouch * KD; Crouching Maneuver. FORWARD CHEST KICK + 0 + 2 -- 1 S,C,A K3 * KD. Forward Flip Kick + 1 + 5 Two S,A (1 W) K3, A3, Handstand Kick * KD, KDA (unless blocking), (dodge move?) *FORWARD SLIDE KICK + 0 + 2 + 0 C, miss A K2, A2 * KD FRONT SNAP KICK + 2 + 2 None S,C,A K2 ** HAMMER KICK -- 2 + 3, + 4 -- 2 C,miss A (1 W) K3,(x2)K,Ft.Swp * KD; Hits Downed opponents. *HEEL STAMP + 2 -- 4 + 1 S,C, miss A K1, A1 * Opponent is Knocked Back (Fighter's Str. + Athletics) - Opponent's Str.; Fighter is KnockedBack 1. JUMPING SOBAT(TO) -- 1 + 4 Two S,C,A K2, A1, Jump * Aerial. (MY: Aviods Sweeps [fist,foot,spin foot], may only be blocked C or w/ Kick Def) This is charlie's hop toward low kick. KNEE DROP -- 1 + 3 -- 1 (miss S,C,A) K2, A1 * Attacks Downed opponents only. LONG SWEEP KICK -- 2 + 3 None C, miss A K2, Crouch, Foot Sweep * KD; Crouching; this maneuver may be used to strike an opponent who is 1 Hex away. PUSH KICK (STOMACH KICK) + 0 + 1 + 0 S,C,A K2 * Knockback. RISING BIRD KICK -- 1 + 0(x3) One S,C (1 W) K4,A4,Jump,Dbl-Hit Kick * KDA; Aerial Maneuver. Shin Strikes (+ 0) (+ 1) (+ 0) (Normal) K3 * used in conjunction with any basic Kick; the fighter must be in an adjacent Hex to use this maneuver. SPINNING FOOT SWEEP -- 2 + 3(x2) None C, miss A (1 W) K2, A1, Foot Sweep * DMG is dealt to all adjacent hexes, target in front of fighter is struck twice; KD; Crouching. SPLITS KICK -- 1 + 4 One S, miss C K2 * KDA STEPPING FRONT KICK + 0 + 1(x2) + 1 S,C (1 W) K4, Double-Hit Kick * Fighter must MV into opponent's hex; 1st hit causes Knockback. Studder Step Kick + 1 + 2 One C(miss A) K3, A1 * Must be blocked low. THRUSTING FORWARD KICK + 1 + 2 + 1 S, C (1 W) K2, A1 * Aerial Maneuver; KDA. Punch Name Speed Damage Move Defense Jab +2 -1 +0 S,C,A Strong Punch +0 +1 +0 S,C,A Fierce Punch -1 +3 -1 S,C,A ---------------------------------------------------------------- Boshi-Ken(Thumb Drive)-1 +2 +0 S,C,A P2,A2 xIf damage is scored opponent suffers -1 move next round. Buffalo Punch -2 +5 One S,A P2 Bushin Air Elbow +2 -1 +2 S,A P3,A1,Elbow Strikes,Jump xAerial Maneuver Caber Punch -2 +3 -1 S,C,A P2,Str4 xKD Cobra Hand Strike +3 +1 +1 S,C,A (1W) P3 Dash Punch +0 +4 +2 S,C (1W) P4,A1 Dash Uppercut +0 +4 +2 S,miss C (1W) P4,A1,Dash Punch xKDA Double Hit Punch -1 +0(x2) +0 S,C,A P2 Ear Pop -1 +0 -1 S,C,A P2 xIgnores Sta:fighter -1 Honor Elbow Barrage +0 +0(x3) One S,C (1W) P4,Elbow Smash,Elbow Strikes xMust be in opponent's hex Elbow Drop +0 +2 +0 miss S,C,A P2,A1 xMust be used on Downed opponent; If opponent is interrupted he loses action and is still considered downed at the end of round. Elbow Smash +2 +2 One S,C,A P1 Elbow Strikes (+0) (+1) (+0) (normal) P3 xUsed in conjunction with any basic punch, must be in opponent's hex. Fist Sweep -1 +3 -2 C,miss A P3 xCrouching Maneuver;KD Flaming Dragon Punch-1 +6(x3) -2 S,C (1C,1W) P5,A1,F2,Dragon Punch xKD;Knockback 1(all);->Aerial Maneuver Hand Of The Crane +1 +0 +0 (Normal) P4 xMay be used in conjunction with any basic Punch while standing. Hand Of The Eagle Claw+1 +0 +1 (Normal) P4,A3,Jump xMay be in conjunction with any basic Punch while Aerial. Hand Of The Striking Mantis+0 +0 +0 (Normal) P4,A2,Dex4 xMay be used in conjunction with any basic Punch while standing: fighter may strike opponent one hex away. Hook +0 +3 -2 S,C,A P1 Iron Palm(Tieh Sha Chang) +0 +4 -1 None (1C) P4,F4 xIgnores Blocks;KDA Kidney Punch +0 +2 +0 S,C,A P2 xFighter must be behind opponent or in opponent's hex to execute this maneuver; following round opponent is -1 SPD. Lunge Punch +0 +1 +1 C P3,A1 Neck Shatterer -1 +4 -2 S,miss A P2,Elbow Strikes Palm Heel Punch -2 +3 +0 S,C,A P2 xWhen DMG is dealt treat total as if it were one higher for purposes of calculating dizzy. Power Uppercut -1 +3 One S,C P1 xKDA Razor Fist Punch +1 +4 +0 S,C (1C,1W) P5 xKnockback1;DMG is Aggrivated Rekka Ken (+3) (+0) (+0) (Normal) (1W per turn)P4,A2 xUsed with any basic punch; can be used for up to 3 turns; if used full 3 turns next round must be spent taunting, or lose 3 Glory; Combo to dizzy. Reverse Fist Punch +0(+2) +2 One S,C,A P1 x+2 SPD if punch follows a set up punch. Rushing Strong +0 +1 +1 S,A P2 Shikan Ken(knuckle fist) +1 +1 +0 S,C P2 xSTR.test to knock opponent back 1 hex; KDA Shockwave +0 +0 None S,C,miss A (1C) P4,F2 xShockwave extends in straight hex line; 1 hex per dot in STR; KD all. Spinning Chothesline +0 +0 -2 S,miss C (1W) P4,A3,Clothesline xDMG vs. all adjacent hexes; Knockback 1 each time DMG is dealt; Advance with MV after each hit, may roll DMG again if applicable; Dodge Maneuver. Spinning Knuckle -1 +1(x2) +3 S,C (1W) P3,A1,Spinning Back Fist xDodge Maneuver. Strong Decending Elvow +0 +1 +1 S,A P2,A1,Jump xAerial. Sword Hand Strike -1 +4 -2 S,C,A P3 xIgnores armor,Toughskin,etc. Triple Strike -2 (+0,+0,+1) None S,C,A P2,K1 xRoll three damage tests as indicated, take highest two rolls. Turn Punch Rnd 1-1 +4 Two S,C (W first turn)P4 Rnd 2-1 +5 Two S,C Rnd 3+0 +6 Two S,C Rnd 4+1 +7 Two S,C xCard is layed face down; May be played at any time thereafter as long as card is left face down; -1 SPD,DMG,MV while charging maneuver; Need not be used. Uppercut +1 +2 -1 S,C,A P1 x +1DMG vs. Crouching." :titles "Brawler, Grappler, Hand-to-Hand, Infighter, Martial Artist, Wrestler" :stat "Body" :abilitymap (abilitymap :Punch (ability :name "Punch") :Kick (ability :name "Kick" :summary "* [Low Attack] -1 Initiative -1 Move +1 Damage") :Grab (ability :name "Grab" :summary "-1 Initiative -1 Action * Attempt to grab an item. Roll vs. Body to succeed.") "Back Fist" (ability :name "Back Fist" :summary "* Strike with the back of the fist or open hand." :titles "Backhand, Bitch Slap") :Clothesline (ability :name "Clothesline" :summary "Clothesline -1 +2 +0 S,C,miss A") "Bull Rush" (ability :name "Bull Rush") :Charge (ability :name "Charge") "Crouching Strike" (ability :name "Crouching Strike" :summary "Crouch low and deliver a powerful blow to the mid-section or below the belt. * [Attack] [5]: +1 Effect" :titles "Ducking Punch") "Deflecting Punch" (ability :name "Deflecting Punch" :summary "* The fighter deflects a punch at him and immediately counters with a punch of his own. * [Counter]: +1 Effect") "Dragon Strike" (ability :name "Dragon Strike" :summary "* When striking with the fist, more power can be exerted when the movement originates from the feet, is guided by the waist, flows through the body, and exits through the fist. * [Attack] [J]: +1 Knockback * [Aerial]" :titles "Dragon Fist, Dragon Punch") "Ear Pop" (ability :name "Ear Pop" :summary "* Disorienting attack that causes temporary or permanent deafness. * -1 Initiative * -1 Attack * +2 Stun * -2 Move * Criticals: Deafness") "Elbow Drop" (ability :name "Elbow Drop") "Elbow Strike" (ability :name "Elbow Strike" :summary "* Devastating blow common to Muay Thai. * +1 Initiative * +1 Damage * 1 Move" :titles "Elbow Smash") "Eye Rake" (ability :name "Eye Rake" :summary "* Disorienting attack that causes temporary or permanent blindness. * -1 Initiative * -1 Attack * +2 Stun * -2 Move * Criticals: Blindness") "Fists of Fire" (ability :name "Fists of Fire") :Haymaker (ability :name "Haymaker" :summary "* A slow all out attack that causes massive damage. Especially useful to finish off weakened opponents. -2 Initiative 0 Move +2 Damage" :titles "Two-Fisted Smash") "Head Butt" (ability :name "Head Butt" :summary "-2 Move +1 Damage") :Hyperfist (ability :name "Hyperfist" :summary "* [Critical Hits] can be exchanged for additional Attacks. Same as [Auto]. -2 Initiative -1 Damage 1 Move" :titles "Hundred Hand Slap, Lightning Fist, Rapid Punch") :Jab (ability :name "Jab" :summary "* A quick, weak strike. +2 Initiative +1 Accuracy -2 Damage +1 Move") "Knife Hand" (ability :name "Knife Hand" :summary "* [Damage]: [Critical Hits] may reduce opponent's [Armor] roll.") "Knuckle Fist" (ability :name "Knuckle Fist" :summary "* [Critical Hits] cause Knockback.") "Monkey Punch" (ability :name "Monkey Punch" :summary "* Grab blocking arm and punch * If opponent used a block, ignore it." :titles "Grab Punch") "Nerve Strike" (ability :name "Nerve Strike" :summary "* Use the tips of the fingers to strike and pinch nerve clusters to produce pain and debilitation. * [Action] * -1 Initiative * +1 Stun" :titles "Atemi Strike, Atemi Waza, Cobra Strike") "One Two Punch" (ability :name "One Two Punch") "Palm Strike" (ability :name "Palm Strike" :titles "Palm Heel Strike, Shotei") "Phoenix Strike" (ability :name "Phoenix Strike" :summary "* Middle finger protrudes from fist to strike nerve clusters to cause numbness. * [Criticals] can be exchanged for Slow tokens.") :Ram (ability :name "Ram" :summary "* [Action] * +1 Knockback" :titles "Shoulder Smash") "Spinning Back Fist" (ability :name "Spinning Back Fist" :summary "* The fighter spins around adding force to the blow. -1 Initiative +1 Damage +1 Move") "Strike Defense" (ability :name "Strike Defense" :summary "* The fighter concentrates on the strikes of the opponent but becomes vulnerable to other attacks. * [Reaction] +1 Initiative -1 Move +2 Defense vs. Strikes (-1 Defense vs. Others)") "Sword Hand" (ability :name "Sword Hand" :summary "+1 Accuracy +1 Damage -2 Move" :titles "Karate Chop") "Tiger Claw" (ability :name "Tiger Claw" :summary "Tiger Claw Strike (+0) (+1) (+0) S,C,A") :Uppercut (ability :name "Uppercut" :summary "* This powerful punch starts low and ends high using the fighter's leg and back muscles to increase damage. * [Criticals] can be exchanged for Knockback -1 Initiative +1 Damage -1 Move") "Axe Kick" (ability :name "Axe Kick" :summary "* Fighter raises his leg high over his head and snaps it down toward the opponent's head and neck. * [High Attack] -1 Initiative -2 Move +1 Damage") "Back Kick" (ability :name "Back Kick") "Backflip Kick" (ability :name "Backflip Kick" :summary "* [High Attack] * [Limited] by [Acrobatics]. +1 Initiative 1 Move (directly backwards) +1 Damage" :titles "Flash Kick") "Crescent Kick" (ability :name "Crescent Kick") "Double Kick" (ability :name "Double Kick" :summary "* [Combo]: [Roundhouse Kick] followed by [Spinning Thrust Kick]") "Dragon Kick" (ability :name "Dragon Kick" :summary "-- 1 +6 (x2) -- 2 S,C (1C, 1W) K5, F4, Jump * Knockback; KD; -->Aerial Maneuver.") "Dragon Tail" (ability :name "Dragon Tail" :summary "* The fighter drops low, extends his leg and whirls around quickly, kicking his opponents and knocking their feet out from under them. -2 Initiative -1 Accuracy Damage is [Knockback] instead. Criticals are [Knockdown] instead." :titles "Iron Broom, Tiger Tail Sweep") "Drop Kick" (ability :name "Drop Kick" :summary "* Ends [Prone]. * Kick the opponent with the soles of both feet and fall to the ground. -- 1 + 2 -- 1 S miss C,A K2, A1 **") "Flying Kick" (ability :name "Flying Kick" :image "MartialArts/FlyingKick.jpg" :summary "* The fighter launches himself feet first into the air toward his opponent. He ends his move with a powerful kick, usually to the opponent's head or midsection. +1 Accurary +1 Damage +1 Move (Aerial in one direction) + 0 + 6 -- 2 S,C (1 W) K4, A4, Jump * Knockback; KD; --> Aerial Maneuver." :titles "Flying Thrust Kick") "Foot Stomp" (ability :name "Foot Stomp" :reference "* The toe crusher. That went out of style when I left kindergarten. - Kung Fu Hustle" :summary "* Stomp on opponent's foot to slow their movement.") "Handstand Kick" (ability :name "Handstand Kick" :summary "* The fighter bends over, places his hands on the ground, and then presses his legs up into a handstand. The legs snap up with tremendous kicking force. Can be used while [Prone] -1 Initiative 1 Move +2 Damage") "Hurricane Kick" (ability :name "Hurricane Kick" :image "MartialArts/HurricaneKick.jpg" :summary "-1 Speed -2 Attack * May attack up to 2 units in any surrounding spaces." :titles "Butterfly Kick, Whirlwind Kick") "Kick Defense" (ability :name "Kick Defense" :summary "* The fighter concentrates on the legs of the opponent but becomes vulnerable to other attacks. * [Reaction] +1 Initiative -1 Move +2 Defense vs. Kicks (-1 Defense vs. Others)") "Kick Off" (ability :name "Kick Off" :summary "* Propel yourself and opponent apart instead of damaging. Especially useful when the opponent is near dangerous terrain. -1 Initiative +1 Accuracy [Hits] are [Knockback] instead. [Critical Hits] are [Knockdown] instead." :titles "Heel Stamp") "Knee Drop" (ability :name "Knee Drop") "Knee Strike" (ability :name "Knee Strike" :image "MartialArts/TigerKnee.jpg" :summary "* Leap up to strike with the knee to the stomach, chest or face using the momentum of the leap to increase damage. +2 Initiative +1 Damage 0 Move" :titles "Flying Knee Thrust, Tiger Knee") "Leg Sweep" (ability :name "Leg Sweep" :summary "* A low spinning kick designed primarily to knock an opponent of his feet. -2 Move -1 Accuracy [Low Attack] +1 Damage [Critical Hits] are [Knockdown]" :titles "Foot Sweep") "Lightning Leg" (ability :name "Lightning Leg" :image "MartialArts/LightningLeg.jpg" :summary "* [Finishing Move] * [Attack]: [Auto] LIGHTNING LEG -- 2 + 1(x3) None as 100handslap (1 W) K3, Double Hit Kick * Knockback; When this maneuver is chosen the fighter determines which of the three attacks strike high, and which strike low (2 high, 1 low; or 1 high, 2 low), this affects blocking accordingly.") "Reverse Front Kick" (ability :name "Reverse Front Kick" :summary "* Feint kick past head then snap back into the back of the head or neck. -1 Initiative +1 Accuracy -2 Move") "Roundhouse Kick" (ability :name "Roundhouse Kick" :summary "* Fighter pivots and kicks using the momentum from the pivot to increase the damage of the kick. -1 Initiative -1 Action +2 Damage") "Scissor Kick" (ability :name "Scissor Kick" :summary "* Leap up and kick two opponents in different directions simultaneously. -1 Initiative 0 Move [Aerial] -1 Damage") "Side Kick" (ability :name "Side Kick") "Slide Kick" (ability :name "Slide Kick" :summary "+1 Speed * [Low Attack] * Critical Hits can be [Knockdown] * End Action [Prone]") "Spinning Thrust Kick" (ability :name "Spinning Thrust Kick" :summary "* Fighter spins gaining momentum and thrusts with the heel. -2 Initiative -2 Move +2 Damage" :titles "Amaranth Kick, Mule Kick") "Vault Kick" (ability :name "Vault Kick" :summary "* Vault over an obstacle and land a devastating kick with all of your weight. +0 Move - Ignore the terrain penalty of 1 space next to the target. +0 Accuracy - [High Attack] +1 Damage Criticals are [Knockback]") "Atomic Drop" (ability :name "Atomic Drop") "Air Throw" (ability :name "Air Throw" :summary "* The fighter intercepts a leaping or flying opponent in mid-air, twists, and slams him to the ground, landing on top of him. * [Reaction], [Aerial] +1 Initiative +0 Damage is [Knockdown]. Damage also reduces falling Damage to the fighter. Criticals are [Knockdown]. Criticals also reduces falling Criticals to the fighter.") :Backbreaker (ability :name "Backbreaker" :summary "* The fighter lifts his opponent in the air and smashes him to the ground or onto his knee. This maneuver can cause serious spinal injuries. * Uses a [Hold] -2 Initiative -1 Accuracy +2 Damage Criticals are [Cripple]") "Backroll Throw" (ability :name "Backroll Throw" :summary "* The fighter grabs the opponent and then rolls backwards while using his legs to help lift and throw the opponent over him. The opponent is send directly behind the fighter and the fighter is left [Prone]. * Uses a [Hold] -1 Initiative +1 Damage is [Knockdown] Criticals are [Knockdown]") "Bear Hug" (ability :name "Bear Hug" :summary "* The fighter wraps his arms around the opponent and crushes him. * [Continuous] * Requires a [Hold] -1 Initiative +1 Damage 1 Move") "Choke Hold" (ability :name "Choke Hold" :summary "* The fighter wraps his arms around the opponents neck and begins choking him. * [Continuous] * Requires a [Hold] -1 Initiative Criticals are [Asphixiation] 1 Move") "Fighting Hold" (ability :name "Fighting Hold" :summary "* While holding the opponent, strike him repeatedly. * Requires [Hold] * [Continuous] +1 Initiative +1 Accuracy +1 Damage 1 Move") "Grappling Defense" (ability :name "Grappling Defense" :summary "* Skilled grapplers must learn how to resist and escape from the same maneuvers that they use. * [Reaction] +1 Initiative -1 Move 0 Damage - Remove a [Hold] from yourself. Criticals - Remove additional [Holds].") "Ground Fighting" (ability :name "Ground Fighting" :summary "* [Passive]: Ignore penalties for being [Prone].") :Headlock (ability :name "Headlock") "Hip Throw" (ability :name "Hip Throw" :summary "* This is a quick move to get an opponent on the ground. The fighter moves a leg behind the opponent's and pushes him past the hip and directly to the floor. -1 Move Damage - [Knockdown] Criticals - [Knockdown]") :Hold (ability :name "Hold" :summary "* Puts a [Hold] on opponent. +1 Initiative 0 Damage - Add a [Hold] token. 0 Criticals") :Hook (ability :name "Hook" :summary "* The hook is a powerful punch with knockout power. * When throwing a hook, the puncher shifts his body weight to the lead foot, allowing him to pivot his lead foot and generate kinetic energy through the hip/torso/shoulder, swinging his lead fist horizontally toward the opponent. -1 Initiative +1 Damage +0 Criticals - [Stun]") "Iron Claw" (ability :name "Iron Claw" :summary "Damaging Grab") "Joint Lock" (ability :name "Joint Lock" :summary "* The fighter grabs a limb tightly and leverages the limb in ways the joint was not meant to turn. The attack is incredibly painful and can cause sprains, dislocations, and breaks. * [Continuous Hold] -2 Initiative -1 Accuracy +0 Damage - +1 Stun +0 Criticals - [Cripples]" :titles "Armbar, Armlock, Hammerlock, Leg Lock") "Knee Bash" (ability :name "Knee Bash" :summary "* While holding the opponent, knee him repeatedly in the head or stomach. * Requires [Hold] * [Continuous] -1 Initiative +1 Accuracy +2 Damage 0 Move") "Neck Break" (ability :name "Neck Break" :summary "* The fighter grabs the opponent's head and twists it with the intention to break the neck. For best effect this is used as a surprise attack. -2 Initiative -2 Accuracy +4 Damage Criticals are [Cripples]") :Nelson (ability :name "Nelson") :Piledriver (ability :name "Piledriver") :Pin (ability :name "Pin" :summary "* While grappling, attempt to immobilize the opponent. * Requires [Grapple] * [Continuous] +1 Damage - Damage is [Stun]. Criticals are [Slow]") :Reversal (ability :name "Reversal") "Shoulder Throw" (ability :name "Shoulder Throw" :summary "* The fighter lifts the opponent his is holding over a shoulder and hurls him as far as his strength will allow. * Requires a [Hold]. -1 Move +1 Damage - [Knockback] in any direction the fighter chooses. Criticals - [Knockback]") "Sleeper Hold" (ability :name "Sleeper Hold") :Suplex (ability :name "Suplex") :Tackle (ability :name "Tackle" :summary "* Dive at the opponent and use weight and momentum to take you both to the ground. +1 Initiative +1 Move +1 Accuracy. Succeed or fail, the fighter is [Prone]. Damage is [Knockdown]. Criticals are [Knockdown]" :titles "Flying Tackle") "Take Down" (ability :name "Take Down" :summary "* Fighter wraps his limbs around the opponent and causes both fighters to fall [Prone]. +1 Initiative -1 Move 0 Damage - Both fighters are [Prone] and puts a [Hold] on the other. 0 Criticals") "Thigh Press" (ability :name "Thigh Press")) :specialtymap (specialtymap :Strikes (specialty :name "Strikes") :Kicks (specialty :name "Kicks") :Grappling (specialty :name "Grappling" :summary "* Atomic Drop * Air Throw * Backbreaker * Backroll Throw * Bear Hug * Choke Hold * Fighting Hold * Grappling Defense * Ground Fighting * Headlock * Hip Throw * Hold * Hook Hold * Iron Claw * Joint Lock * Knee Bash * Neck Break * Nelson * Piledriver * Pin * Reversal * Shoulder Throw * Sleeper Hold * Suplex * Tackle * Take Down * Thigh Press") :Aikido (specialty :name "Aikido" :reference "* Water flows and takes any shape or course, yet it is always consistant with its own nature." :summary "* This essentially noncombative Japanese art concentrates on the development of the self, and physical, mental, and spiritual nonresistance. By moving with and blending with an opponent's attacks, they may be used against him. * Athletics - [Breakfall] * Evasion - [Deflect], [Disengage], [Drunken Monkey Roll], [Evasive Roll], [Iron Horse], [Weapon Block] * Grapples - [Air Throw], [Backroll Throw], [Disengage], [Grab], [Grapple Defense], [Hip Throw], [Joint Lock], [Pin], [Shoulder Throw], [Takedown] * Kicks - [Dragon Tail], [Kick Defense], [Leg Sweep], [Slide Kick] * Strikes - [Nerve Strike], [Strike Defense] GRAB: Ugoku Taosu(5) Atemi Torae(4) FOCUS: Push(2) Chi Kung Healing(3) Ghost Form(5) Stunning Shout(3) Zen No Mind(3)" :titles "Aikijutsu") :Boxing (specialty :name "Boxing" :summary "* Boxing is a fighting style that concentrates exclusively on punches. * Evasion - [Iron Skin] * Strikes - [Dash Attack], [Deflecting Punch], [Feint], [Haymaker], [Head Butt], [Hook], [Hyperfist], [Jab], [Ram], [Spinning Back Fist], [Uppercut] * Grapples - [Grab]") :Brawling (specialty :name "Brawling" :summary "* Brawling is no holds bars, no rules hand to hand fighting." :titles "Bruiser, Pit Fighter, Street Fighter, Thug") :Capoeira (specialty :name "Capoeira" :summary "* A Brazilian marital art developed by slaves who were brought to South America from Africa. The style was disguised as dance to avoid punishment when caught training. The style is still typically practiced to music. The style developed acrobatic maneuvers that could be used while chained. Capoeiristas will sometimes cross the field doing cartwheels. Knife fighting is also sometimes included in the style. * Athletics - [Backflip], [Breakfall], [Cartwheel], [Jump], [Kippup] * Evasion - [Drunken Monkey Roll] * Grapples - [Backroll Throw] * Kicks - [Backflip Kick], [Dragon Tail], [Handstand Kick], [Kick Defense], [Knee Strike], [Leg Sweep], [Spinning Thrust Kick] * Strikes - [Head Butt], [Strike Defense]") "Commando Training" (specialty :name "Commando Training" :summary "* Commando Training is a generic term for the fighting styles taught to armed forces members. It is a practical, sometimes brutal style that borrows from a variety of other styles and combines them into a style that can be taught to recruits quickly. * Evasion - [Disarm], [Kick Defense], [Strike Defense] * Grapples - [Choke Hold], [Grab], [Grapple Defense], [Knee Bash], [Joint Lock], [Pin], [Shoulder Throw], [Tackle] * Kicks - [Knee Strike], [Leg Sweep] * Strikes - [Elbow Strike], [Hook], [Knife Hand], [Spinning Back Fist], [Sword Hand]" :titles "Special Forces Training") :Hapkido (specialty :name "Hapkido" :summary "* This Korean Martial Art borrows many techniques successfully from other styles; it is a combination of the Aidido, Jujutsu, and Karate styles of Japan with the Korean systems of hwang Do and Taekyon (percursor to Tae Kwan Do). It is a style that teaches focus on passivity in opposing force, countering and attacking with circular motions, and the absolute penetration of an opponent's defenses. * A Hapkido practitioner receives a strong attack gently and counters a gentle attack powerfully and a subtle rythym of attacks and counters develops in the combat. This perpetual and fluid rythym, as well as constant mobility, are hallmarks of the style. * Athletics - [Breakfall], [Jump] * Evasion - [Disarm], [Evasive Roll] * Grapples - [Back Roll Throw], [Grappling Defense], [Joint Lock], [Choke Hold], [Pin], [Shoulder Throw], [Takedown] * Strikes - [Deflecting Punch], [Nerve Strike], [Phoenix Strike], [Spinning Back Fist], [Strike Defense] * Kicks - [Axe Kick], [Crescent Kick], [Double Kick], [Flying Kick], [Kick Defense], [Leg Sweep], [Roundhouse Kick], [Spinning Thrust Kick]") :Hsing-I (specialty :name "Hsing-I" :summary "* Hsing-I stylists attempt to use the body's internal energy, ch'i, to perform astounding feats. The first set of block-strike manuevers are based on the five elements (fire, water, earth, metal, and wood). The second is a group of animal based forms (including Dragon, Tiger, Horse, Turtle, Chicken, Snake, and Bear). The typical attack is to block a strike, grab the arm or leg, and strike back with the hand. * Evasion - [Deflect], [Weapon Block] * Brawling - [Haymaker] * Grapples - [Hip Throw], [Joint Lock] * Kicks - [Kick Defense], [Leg Sweep] * Strikes - [Grab Punch], [Nerve Strike], [Phoenix Strike], [Strike Defense]" :titles "Heart and Mind") :Hwarang-Do (specialty :name "Hwarang-Do" :summary "* This style concentrates on punches and a wid variety of weapon techniques. Further masters are said to possess mystical powers including telepathy, clairvoyance, and the ability to sense danger. * A Korean style that is said to have grown out of certain healing techniques, and modern masters are often healers as well. Legend has it that a Buddhist mong developed the style and taught it to the Hwarang who were similar the Korean equivalent of knights: fighters, diplomats, and military leaders who lived by a strict code of honor. * Athletics - [Breakfall], [High Jump], [Kippup], [Long Jump] * Evasion - [Deflect], [Disengage] * Grapples - [Choke Hold], [Grapple Defense], [Joint Lock], [Shoulder Throw] * Kicks - [Backflip Kick], [Kick Defense], [Roundhouse Kick], [Slide Kick] * Strikes - [Dash Attack], [Elbow Strike], [Nerve Strike], [Phoenix Strike], [Strike Defense] * Focus Powers - [Blind Fighting], [Spirit Healing], [Zen No Mind]") "Jeet Kune Do" (specialty :name "Jeet Kune Do" :reference "* Use whatever works." :summary "* A martial art created by the late Bruce Lee. After studying many differenct martial arts, Lee decided that their reliance on a limited group of maneuvers made them ineffective. Instead, he catalogued all of the ways that the human body could be used to attack or defend and then created a simplified and practical fighting style with no patterns or predefined conceptions. * Grapples - [Choke Hold], [Joint Lock], [Hip Throw] * Kicks - [Foot Stomp], [Kick Defense], [Lightning Leg], [Roundhouse Kick] * Strikes - [Elbow Strike], [Feint], [Nerve Strike], [One Two Punch], [Phoenix Strike], [Spinning Back Fist], [Strike Defense] * Focus Powers - [Zen No Mind]" :titles "The Way of the Intercepting Fist") :Jujutsu/Judo (specialty :name "Jujutsu/Judo" :summary "* A Japanese fighting style with roots 1200 years old. * Jujutusu focuses on grapples instead of strikes. The typical maneuver grabs an opponent, forces him to the ground, and finishes him off. * Athletics - [Breakfall], [Kippup] * Evasion - [Disarm], [Disengage], [Iron Horse] * Grapples - [Air Throw], [Backroll Throw], [Choke Hold], [Ground Fighting], [Hip Throw], [Joint Lock], [Pin], [Shoulder Throw], [Takedown] * Kicks - [Dragon Tail], [Leg Sweep] * Strikes - [Disarm], [Nerve Strike]") :Kabaddi (specialty :name "Kabaddi" :summary "* [Head Butt] KICK: Slide Kick(2) BLOCK: San He(3) Energy Reflection(3) GRAB: Head Butt Hold(2) Brain Cracker(1) Dislocate Limb(3) Disengage(1) Air Suplex(1) ATHLETICS: Cannon Drill(5) Flying Body Spear(2) FOCUS: Chi Kung Healing(3) Extendible Limbs(4) Fireball(3) Improved Fireball(5) Regeneration(1) Yoga Flame(3) Yoga Teleport(5) Cobra Charm(2) Ghost Form(5) Flying Fireball(3) Inferno Strike(5) Mind Reading(3) Telepathy(2) Chi Push(5) Levitation(3) Balance(3) Leech(3)") :Kalaripayattu (specialty :name "Kalaripayattu" :summary "* A boxing art from southern India that dates back to 500 AD. Fighters are trained in 4 syltes: unarmed, stick fighting, other weapons, and the 108 vital points of the human body. Masters are also skiled healers. * Athletics - [Breakfall], [Jump] * Grapples - [Joint Lock], [Throw] * Kicks - [Flying Kick], [Roundhouse Kick] * Strikes - [Elbow Strike], [Nerve Strike], [Phoenix Strike], [Strike Defense], [Sword Hand] * Focus Powers - [Spirit Healing]" :titles "Battlefield Practices, Gurus") :Karate (specialty :name "Karate" :summary "* Karate focuses on direct strikes and kicks with few grabs or throws. * An extremely popular martial art originating in Okinawa, Japan in 400 AD. It became well developed only after the Japanese invaders forbade the Okinawans to carry weapons. * Athletics - [Jump], [Kippup] * Close Combat - [Hook] * Evasion - [Deflect], [Disarm], [Iron Horse], [Iron Skin] * Grapples - [Backroll Throw], [Hip Throw], [Shoulder Throw] * Kicks - [Axe Kick], [Back Kick], [Cresent Kick], [Dobule Kick], [Dragon Tail], [Flying Kick], [Foot Stomp], [Kick Defense], [Leg Sweep], [Reverse Front Kick], [Roundhouse Kick], [Scissor Kick] * Strikes - [Crouching Strike], [Dash Attack], [Dragon Fist], [Elbow Strike], [Knife Hand], [Nerve Strike], [Palm Strike], [Spinning Back Fist], [Strike Defense], [Sword Hand], [Tiger Claw]" :titles "Empty Hands") :Kickboxing (specialty :name "Kickboxing" :summary "* [Backroll Throw] * [Dashing Punch] * [Haymaker] * [Hyperfist] * [Knee Bash] * [Slide Kick] * [Spinning Back Fist] PUNCH: Feint(1) Hook(1) Double Hit Punch(1) Heart Punch(4) Lunge Punch(2) Fist Sweep(2) Dashing Punch(5) Turn Punch(5) Rekka Ken(5) Spinning Back Fist(1) Spinning Knuckle(3) KICK: Double Dread Kick(3) Back Roundhouse(1) Ax Kick(3) Reverse Frontal Kick(1) Flying Knee Thrust(1) Stepping Front Kick(3) Slide Kick(2) Double Hit Kick(1) Wounded Knee(2) BLOCK: Deflecting Punch(1) GRAB: Knee Basher(2) Back Roll Throw(1) Brain Cracker(1) ---- Savate ---- PUNCH: Spinning Back Fist(1) Palm Heel Punch(1) Ear Pop(2) Spinning Knuckle(3) KICK: Ax Kick(2) Double Hit Kick(1) Flash Kick(4) Double Dread Kick(3) Foot Sweep(1) Spinning Foot Sweep(1) Lightning Leg(5) Slide Kick(2) Stepping Front Kick(4) Flying Knee Thrust(1) Double Hit Knee(1) BLOCK: GRAB: Knee Basher(2) Bear Hug(1) Neck Choke(2)" :titles "Savate") :Kobujutsu (specialty :name "Kobujutsu" :summary "* The martial art specializing in Okinawan weapons. * Melee - [Bash], [Dazing Blow], [Disarm], [Fleche], [Jab], [Parry], [Riposte], [Slash], [Sweep], [Thrust] * Melee Weapons - [Bo Staff], [Eiku], [Jo Staff], [Kama], [Nunchaku], [Sai], [Tonfa]") :Krabi-Krabong (specialty :name "Krabi-Krabong") "Kung Fu, Crane Style" (specialty :name "Kung Fu, Crane Style" :summary "* The crane was known for its grace and beauty. Known to stand on one leg for long periods of time, it is no wonder that the crane stylists had excellent balance and were known for their awesome kicking ability and long range techniques. * Crane is very upright, attacking with carefully aimed strikes at long range and defending with redirection and retreat rather than resistance. Working from outside an opponent's effective range, Crane demands extreme technical proficiency and smooth footwork, as well as careful timing and judgment. Crane is high, circular, soft, and distant, working chiefly with progressive indirect attacks. * Athletics - [Breakfall], [High Jump], [Jump] * Evasion - [Avoid], [Deflect], [Evasive Roll], [Sidestep] * Kicks - [Axe Kick], [Flying Kick], [Kick Off], [Leg Sweep], [Vault Kick] * Strikes - [Dash Attack], [Grab Punch], [Nerve Strike], [Spinning Back Fist]") "Kung Fu, Dragon Style" (specialty :name "Kung Fu, Dragon Style" :summary "* Shen Lung (Spiritual or Invisible Dragon): While the Dragon is not a formally taught style in Shen Lung it instead represents what emerges when a practitioner can draw freely from all five animals as the situation demands. One who can use the power of Tiger, the mechanics of Mantis, the speed of Snake, the movements of Crane, and the cunning of Monkey. * As the dragon floats through the sky he twists and coils, flipping his tail as he turns. The dragon stylist uses turns and circular motions to throw and strike his opponents. * 'Ride the wind', a phrase which means follow rather than lead. Provide no opening without first letting your opponent open. Unlike Crane, which also relies heavily upon evasion as a tactic, the Dragon evades primarily by rotation of upper or lower torso with little or no stance movements, while the Crane stylist hops frequently to reposition the entire body. Both styles employ pinpoint strikes to vulnerable meridian targets, but dragon also heavily uses tiger-like punches and clawing techniques, snake-like stance shifts, and leopard-like hit and run strikes to weaken a physically superior adversary. Dragon kung fu also regularly employs low sweeping techniques * Kicks - [Dragon Tail], [Flying Kick] * Strikes - [Dragon Fist], [Nerve Strike]") "Kung Fu, Leopard Style" (specialty :name "Kung Fu, Leopard Style" :summary "* The leopard was known for its tremendous speed and cunningness. Unlike the tiger that doesn't mind frontal attacks, the leopard stylist prefers to attack only when the odds are in his favor. The only time he shows he is hurt is when he is not. He acts like he is running away in order to come back with an attack on his own ground. * Blocking is wasted in Leopard - the style can be summed up with 'Why block when you can hit?' It does not rely on rooted stances, and would only assume a stance while in attack in order to launch at the opponent. This hit and run technique of the leopard, something especially effective against larger opponents, is unique to the animal. * An interesting technique of the leopard is the ability to simultaneously block and strike. The sheer speed of the leopard is a defining characteristic of the style * Evasion - [Dodge], [Dodge Roll] * Strikes - [Deflecting Punch], [Dash Attack]") "Kung Fu, Mantis Style" (specialty :name "Kung Fu, Mantis Style" :summary "* Mantis operates in sequences and combinations baffling opponents with multiple simultaneous attacks and blocks, all executed at high speed. Mantis is a quick, high, linear, hard style that attacks by rapidly executed combinations. * [Combo] * Strikes - [Deflecting Punch], [Hyperfist], [Jab], [Knife Hand], [One Two Punch]") "Kung Fu, Monkey Style" (specialty :name "Kung Fu, Monkey Style" :summary "* Monkey style prefers to go to the ground, integrating throws, locks, grappling and ground-fighting. Monkey is very low, both hard and soft, close-range and favors full body contact. * Evasion - [Drunken Monkey Roll] * Grapples - [Grab], [Joint Lock], [Hold], [Pin], [Takedown] * Strikes - [Monkey Punch]") "Kung Fu, Snake Style" (specialty :name "Kung Fu, Snake Style" :summary "* The snake is known for its speed once an opponent is in striking range. The snake raises its head and waits patiently until the unsuspecting opponent gets too close. The snake stylist, too, concentrates on waiting until the time is right and with his fingertips, strikes to a vital spot in a blink of an eye. Knowing how to use one's internal energy or chi is a major part of the snake system. * Snake is a soft style using an opponent's energy against them rather than resisting it. Snakes absorb, control and redirect rather than block an attack. Snake stylists are known for circular and whip-like motions flowing around opponents, climbing over their defenses and striking repeatedly in rapid succession. Snake is high, circular, soft and extremely fast, favoring progressive direct attacks that overwhelm a defense. * Snake style is based on whipping power which travels up the spine to the fingers. The ability to sinuously move, essentially by compressing one's stomach/abdominal muscles, is very important. * Strikes - [Back Fist], [Knife Hand], [Nerve Strike] * Focus Powers - [Death Touch]") "Kung Fu, Tiger Style" (specialty :name "Kung Fu, Tiger Style" :summary "* Known for its power and strength, the tiger stylists were known for their ripping and tearing techniques. Hands held like tiger claws, these fighters would strike and claw with tremendous speed and power. * Tiger emphasizes close-range strikes, throws, and a willingness to stay in the danger zone long enough to set up a single fight-ending blow. Tiger commits fully to every motion, and maximizes power at the expense of mobility. Tiger is low, hard-style, and works with single direct attacks. * Strikes - [Crouching Strike], [Dash Attack], [Dragon Fist], [Elbow Strike], [Eye Rake], [Haymaker], [Strike Defense], [Sword Hand], [Tiger Claw]") "Kung Fu, Wing Chun" (specialty :name "Kung Fu, Wing Chun" :summary "* Wing Chung, literally 'singing spring', is a Southern Chinese kung fu style and a form of self-defense originating in Qing China, which requires quick arm movements and strong legs. Softness (via relaxation) and performance of techniques in a relaxed manner is fundamental to Wing Chun.") "Muay Thai" (specialty :name "Muay Thai" :reference "* Apachai: The use of knees and elbows is very important in Muay Thai. * Akisame: Which, in fact, is rather rare as most contemporary martial arts have banned the use of knees and elbows in tournament fighting. * Kenichi: Really? How come? * Apachai: If you use them wrong, you can kill your opponent! * Akisame: That's right. However, in Muay Thai, they specifically focus on these moves. * Kenichi: Yeahhh, and why is that? * Apachai: Because if you use them right, you can kill your opponent! - Kenichi: World's Mightiest Disciple" :summary "* A fast, brutal martial art from Thailand. * The style uses close strikes with the knees, elbows, fists, and feet. There are no grabs or throws. Fighters often jump up to add more force to their blows. Fighters are also trained to take damage as much as avoid it. * Evasion - [Iron Skin] * Grapples - [Knee Bash] * Kicks - [Axe Kick], [Double Kick], [Foot Stomp], [Kick Defense], [Knee Drop], [Knee Strike], [Leg Sweep], [Lightning Leg], [Reverse Front Kick], [Roundhouse Kick] * Strikes - [Dash Attack], [Dragon Punch], [Elbow Drop], [Elbow Strike], [Feint], [One Two Punch], [Ram], [Spinning Back Fist], [Strike Defense], [Sword Hand], [Uppercut]" :titles "Thai Kickboxing") :Ninjutsu (specialty :name "Ninjutsu" :summary "* Ninjutsu is the art of the Japanese Ninja. Ninjutsu saw greatest use from 1200-1600 AD when warlords employed ninja clans to spy on and assassinate their enemies. * The primary weapons of the ninja are the ninja-to sword and shuriken throwing stars. They were also adept in many types of concealed weapons. They are also known for unusual gadgets to assist them in climbing, crossing water, picking locks, etc. They are assassins, so they are not interested in honorable combat and will use traps or poison instead of combat if possible. * Kunoichi - Female ninja operated as infiltrators, spies and assassins. They spent time in enemy houses, reported secrets and undermined rival houses by any means necessary. Kunoichi could use their gender to their advantage because women were underestimated as warriors. This made it easier for them to get closer to their targets by posing as maids, geisha, servants and priestesses. In some cases, they were taken on as concubines and mistresses, giving them unparalleled access to all their marks. * Athletics - [Backflip], [Breakfall], [Jump], [Wall Spring] * Evasion - [Deflect], [Disarm], [Dirty Fighting], [Disengate], [Distraction], [Dive for Cover], [Dodge], [Dodge Roll], [Weapon Block] * Grapples - [Air Throw], [Backroll Throw], [Choke Hold], [Grapple Defense], [Groundfighting], [Joint Lock], [Suplex], [Takedown], [Tackle] * Kicks - [Backflip Kick], [Handstand Kick], [Leg Sweep], [Roundhouse Kick], [Slide Kick] * Strikes - [Ear Pop], [Grab Punch], [Nerve Strike], [Phoenix Strike] * Melee - [Dazing Blow], [Jab], [Parry], [Riposte], [Slash], [Thrust]" :titles "Shinobi, Kunoichi") :Pakua (specialty :name "Pakua" :summary "* A Chinese 'internal' fighting style derived from I Ching, the Book of Changes which states that the universe is in a state of constant change. Therefore, in Pakua, any change, the placement of the foot, the turning of a hand is important. Pakua is highly circular and emphasizes footwork and constant motion. Pakua masters are said to use palm strikes instead of fist strikes to better control the energy they release. * Evasion - [Deflect], [Sidestep], [Weapon Block] * Grapples - [Grapple Defense], [Joint Lock] * Kicks - [Kick Defense], [Leg Sweep] * Strikes - [Grab Punch], [Palm Strike], [Strike Defense] * Focus Powers - [Zen No Mind]" :titles "Eight Diagrams") :Pentjak-Silat (specialty :name "Pentjak-Silat" :summary "* A broad set of Indonsian fighting styles. Fighters are trained to keep their footing on unstable ground because the condition is so common in Indonesia. Silat teaches many weapons especially the kris, a wavy bladed dagger. The mysticism and legends surrounding this weapon equal or exceed the katana. * Athletics - [Breakfall], [Disarm], [Disengage], [Dodge Roll], [Jump], [Kippup] * Evasion - [Deflect], [Hip Throw], [Iron Horse], [Iron Skin] * Grapples - [Choke Hold], [Grab Punch], [Grapple Defense], [Joint Lock], [Pin], [Takedown] * Kicks - [Double Kick], [Dragon Kick], [Flying Kick], [Leg Sweep], [Lightning Leg], [Roundhouse Kick] * Strikes - [Deflecting Punch], [Hyperfist], [Jab], [Nerve Strike], [Phoenix Strike], [Sword Hand] * Melee - [Fleche], [Parry], [Riposte], [Slash], [Thrust]" :titles "Guru, Pandekar, Silat") :Savate (specialty :name "Savate" :summary "* French Kickboxing developed in Marseilles in the 1600s from kick brawling French sailors. The style is characterized by a bouncing gait and a unique kick style. When delivering kicks, the fighter leans away from the direction of the kick and stretches one arm back like a fencer to maintain balance. This allows the torso to pivot away from any counterattack. Kicks are landed with the toes or shins instead of the ball or heel and are designed to quickly slip by blocking arms. * Evasion - [Disarm] * Grapples - [Back Roll Throw], [Bear Hug], [Choke Hold], [Knee Bash] * Kicks - [Axe Kick], [Double Kick], [Kick Defense], [Kick Off], [Knee Strike], [Leg Sweep], [Lightning Leg], [Roundhouse Kick], [Slide Kick], [Spinning Thrust Kick] * Strikes - [Dash Punch], [Deflecting Punch], [Ear Pop], [Feint], [Hook], [One Two Punch], [Palm Strike], [Spinning Back Fist], [Strike Defense]" :titles "Savateur, Savateuse") :Sumo (specialty :name "Sumo" :summary "* Evasion - [Iron Horse], [Iron Skin] * Grapples - [Air Throw], [Bear Hug], [Grapple Defense], [Knee Bash], [Hip Throw], [Shoulder Throw] * Kicks - [Double Kick], [Dragon Tail], [Leg Sweep] * Strikes - [Ear Pop], [Head Butt], [Hyperfist], [One Two Punch], [Palm Strike], [Sword Hand]" :titles "Cireum") "Tae Kwon Do" (specialty :name "Tae Kwon Do" :summary "* A Korean martial art developed in the 1600s AD. It emphasizes kicks over punches. * Athletics - [Breakfall], [Jump], [Wall Spring] * Evasion - [Deflect], [Iron Horse] * Kicks - [Axe Kick], [Double Kick], [Flying Kick], [Hurricane Kick], [Kick Off], [Knee Strike], [Lightning Leg], [Reverse Front Kick], [Roundhouse Kick], [Scissor Kick] * Strikes - [Deflecting Punch], [Haymaker], [Hyperfist], [Spinning Back Fist], [Sword Hand]" :titles "The Way of Kicking and Punching") "Tai Ch'i Ch'uan" (specialty :name "Tai Ch'i Ch'uan" :summary "* The ultimate internal Chinese martial art. The style is based on the Thirteen Postures (8 actions, 5 directions). It emphasizes blocking a strike and grabbing or striking back. * Athletics - [Balance], [Breakfall] * Evasion - [Deflect], [Disarm], [Disengage], [Iron Horse], [Iron Skin] * Grapples - [Air Throw], [Back Roll Throw], [Grab Punch], [Grappling Defense], [Hip Throw], [Joint Lock], [Pin], [Shoulder Throw] * Kicks - [Dragon Tail], [Kick Defense], [Leg Sweep], [Slide Kick] * Strikes - [Deflecting Punch], [Grab Punch], [Nerve Strike], [Palm Strike], [Phoenix Strike], [Strike Defense] * Focus - [Empty Force], [Spirit Healing], [Zen No Mind]" :titles "Supreme Ultimate Fist, Yin-Yang Boxing") :Wrestling (specialty :name "Wrestling" :summary "* Wrestling is one of the earliest martial arts. Virtually every ancient society had some form of wrestling and many have survived largely unchanged. * Atheltics - [Breakfall], [Jump] * Evasion - [Disengage] * Grapples - [Air Throw], [Backbreaker], [Bear Hug], [Choke Hold], [Grapple Defense], [Hip Throw], [Iron Claw], [Joint Lock], [Knee Bash], [Nelson], [Piledriver], [Pin], [Reversal], [Sleeper Hold] [Shoulder Throw], [Suplex], [Tackle], [Take Down], [Thigh Press] * Kicks - [Knee Strike] * Strikes - [Ear Pop], [Haymaker], [Ram]" :titles "Dumog/Greco Roman/Koshti/Naban/Sanbo/Yaghliguresh") "Wu Shu" (specialty :name "Wu Shu" :summary "* [Axe Kick] * [Backflip Kick] * [Backroll Throw] * [Drunken Monkey Roll] * [Flying Kick] * [Handstand Kick] * [Hurricane Kick] * [Kick Off] * [Kippup] * [Leg Sweep] * [Lightning Leg] * [Reverse Front Kick] * [Rolling Attack] * [Scissor Kick] * [Slide Kick] * [Spinning Back Fist] * [Spinning Thrust Kick] * [Wall Spring] PUNCH: Rekka Ken(5) Spinning Knuckle(3) KICK: Back Flip Kick(2) Forward Back Flip Kick(1) Ax Kick(4) Cartwheel Kick(2) Reverse Frontal Kick(2) Scissor Kick(4) Flying Thrust Kick(4) Forward Flip Knee(2) Handstand Kick(1) Hurricane Kick(1) Air Hurricane Kick(1) Lightning Leg(3) Stepping Front Kick(4) Whirlwind Kick(4) Double Hit Kick(1) Great Wall Of China(5) Descending Wheel Kick(4) BLOCK: Maka Wara(4) San He(3) GRAB: Air Throw(2) Back Roll Throw(1) ATHLETICS: Cannon Drill(5) Displacement(4) Backflip(2) Flying Heel Stomp(3) Rolling Attack(3) Vertical Rolling Attack(3) Wall Spring(1) Evasive Tumble(2) FOCUS: Balance(4) Chi Kung Healing(4) Fireball(4) Improved Fireball(5) Flying Fireball(3)") :Binding (specialty :name "Binding" :summary "* Includes Garotte, Pianowire, Monofilament, Pillowcase, Towel, Rolled up Shirt, etc." :titles "Strangler") :Knives (specialty :name "Knives" :reference "* Do you want to know why I use a knife? Guns are too quick. You can't savor all the little...emotions. You see, in their last moments, people show you who they really are. So, in a way I know your friends better than you ever did. Would you like to know which of them were cowards? - Joker, The Dark Knight" :summary "* Includes Pocket Knives, Switchblades, Straight Razors, Small Kitchen Knives, etc." :titles "Butcher, Knife Fighter, Murderer"))) "Combat Focus" (skill :name "Combat Focus" :titles "Chi Powers" :stat "Spirit" :abilitymap (abilitymap "Blind Fighting" (ability :name "Blind Fighting") :Combo (ability :name "Combo" :summary "* Any combat abilities may be strung together as a Combo. Every ability after the first gets +1 to initiative. If any ability misses or fails, then the combo ends and the next ability is at -1 initiative. Each combo must be chosen when this ability is gained and must be taken again for each separate combo.") "Death Touch" (ability :name "Death Touch" :reference "Five Point Palm Exploding Heart Technique - Kill Bill" :summary "* The fighter strikes vulnerable pressure points, disrupting the opponent's chi flow causing intense pain or death. The effect has no outward effect, but the victim will know something is wrong. Eventually, the victim recovers or dies suddenly from the stress. -1 Action -2 Initiative -2 Accuracy +0 Damage - [Stun] only +3 Criticals - [Poison] 0 Move -1 Defense" :titles "Dim Mak") "Empty Force" (ability :name "Empty Force" :summary "* The fighter projects a strike across empty space. The fighter may strike at any range, but if he does not score at least 1 Criticals for each space of Range, the ability fails. -2 Initiative -2 Move -1 Damage Critical - [Range]" :titles "Distant Death, Kongjin") "Feather Walk" (ability :name "Feather Walk" :summary "* Reduces body weight while active. This increases the effects of [Retreat] and leaping while decreasing falling speed and damage. * If [Skill] greater than or equal to [Body], then unit may walk on any substance that would suspend a feather." :titles "Feather Fall, Walk on Water") "Feign Death" (ability :name "Feign Death") "Hold Breath" (ability :name "Hold Breath") "Spirit Healing" (ability :name "Spirit Healing" :titles "Chi Kung Healing") "Team Combo" (ability :name "Team Combo" :reference "Fastball Special - Colossus and Wolverine, X-men" :summary "* Like a [Combo], the Team Combo chains attacks together. The Team Combo however is performed by different members of a team with the identical Team Combo. Any team member may perform each step of the combo with each subsequent attack allowed to reroll 1 die. The combo ends if any attack misses, any member attacks twice in a row, or if a turn passes with no attack attempt. Any combat abilities may be strung together as a Team Combo (even abilities that only others in the team possess). Each combo must be chosen when this ability is gained and must be taken again for each separate combo.") "Walk on Fire" (ability :name "Walk on Fire") "Zen No Mind" (ability :name "Zen No Mind" :reference "The mind must always be in the state of 'flowing,' for when it stops anywhere that means the flow is interrupted...In the case of the swordsman, it means death. When the swordsman stands against his opponent, he is not to think of the opponent, nor of himself, nor of his enemy's sword movements. ... When he strikes, it is not the man but the sword in the hand of the man's subconscious that strikes. - Zen Master Takuan Soho" :summary "* A mind not fixed or occupied by thought or emotion and thus open to everything. * Mushin is achieved when a fighter feels no anger, fear or ego during combat, so the fighter is totally free to act and react towards an opponent without hesitation. At this point, a person relies not on what they think should be the next move, but what is felt intuitively. * A martial artist would likely have to train for many years to be capable of mushin. This allows time for combinations of movements and exchanges of techniques to be practiced repetitively many thousands of times, until they can be performed spontaneously, without conscious thought." :titles "Mushin"))) :Evasion (skill :name "Evasion" :summary "* Evasion is a special defense typically used by those that choose to wear light or no Armor." :stat "Defense" :abilitymap (abilitymap "Blade Locking" (ability :name "Blade Locking" :summary "* [Requires]: [Parry], May only be used against swords, knives or polearms. * [Reaction]: -2 * [Success]: Opponent gains a [Broken Defense Token] for each [Hit]") :Block (ability :name "Block" :summary "* [Requires]: Can only be used vs Melee or Close Combat toward the left front or right front. May be used with or without a weapon. * [Reaction]: +1 Defense.") :Deflect (ability :name "Deflect" :summary "* Deflect, catch, or even return projectiles hurled at the fighter. * This ability provides a second Defense roll against a projectile attack before the regular Defense roll. * [Reaction] +2 Initiative +1 Accuracy 0 Damage - Any successes become -Damage to the projectile. If the projectile has 0 Damage remaining, it is caught. Criticals - Any Criticals become -2 Damage to the proejctile. If the projectile has 0 Damage remaining and there are still Criticals, the projectile may be immediately thrown at +[Criticals] Accuracy.") "Dirty Fighting" (ability :name "Dirty Fighting" :titles "Bite, Eye Gouge, Ear Pop, Hair Pulling, Low Blow") :Disarm (ability :name "Disarm" :reference "The Red Leaves Cut means knocking down the enemy's long sword. The spirit should be getting control of his sword. When the enemy is in a long sword attitude in front of you and intent on cutting, hitting and parrying, you strongly hit the enemy's sword with the Fire and Stones Cut... If you then beat down the point of his sword with a sticky feeling, he will necessarily drop the sword. If you practise this cut it becomes easy to make the enemy drop his sword. - Miyamoto Mushashi, The Book of Five Rings" :summary "* Strike to knock a weapon or item from opponent's grasp. * This special ability does no damage but allows the user to force a target to drop an item (usually a weapon). -1 Initiative -1 Accuracy 0 Damage. Opponent drops the chosen item. Each critical moves the item 1 space away (your choice)." :titles "Red Leaves Cut") :Disengage (ability :name "Disengage" :summary "* The fighter removes a [Hold] token. * [Reaction] +1 Initiative 0 Damage -1 Move") "Dive for Cover" (ability :name "Dive for Cover") :Dodge (ability :name "Dodge" :summary "+1 Initiative -1 Action +1 Defense") "Dodge Roll" (ability :name "Dodge Roll") "Drunken Monkey Roll" (ability :name "Drunken Monkey Roll" :summary "* [Crouching] -1 Action +2 Initiative +2 Move +1 Defense") "Iron Horse" (ability :name "Iron Horse" :reference "The Blob, X-men" :summary "* The ability to prevent being moved. * [Passive] +1 Initiative Defense - When rolling Defense, [Hits] or [Criticals] can be exchanged for [Knockback] or [Knockdown] resistance. 0 Move" :titles "San He") "Iron Skin" (ability :name "Iron Skin" :summary "* Hardening of the skin to prevent cuts and punctures." :titles "Maka Wara, Stone Skin") :Sidestep (ability :name "Sidestep")) :specialtymap (specialtymap "Light Armor" (specialty :name "Light Armor") :Bucklers (specialty :name "Bucklers"))) :Melee (skill :name "Melee" :reference "* Mizu: I must become the greatest swordsman alive. Swordfather: Is that all? - Mizu and Swordfather, Blue Eye Samurai" :summary "* [Targetting]: Melee combat may only be used to attack the 3 space directly ahead of you or the space you are on. * See Arms and Armor for weapons" :titles "Battlemaster, Champion, Congueror, Fencer, Fighter, Master of Arms, Warrior" :stat "Body" :abilitymap (abilitymap "Abdomen Timing of Two" (ability :name "Abdomen Timing of Two" :reference "Abdomen Timing of Two refers to feinting an attack, then striking an enemy as they are retracting from an attack, hitting them in the abdomen with the correct timing of either two moves or two seconds. Although the technique seems relatively simple, Musashi lists this as one of the hardest techniques to time correctly.") "Anvil Strike" (ability :name "Anvil Strike" :summary "* [+1 Damage] when target is adjacent to solid terrain.") :Backlash (ability :name "Backlash") :Bash (ability :name "Bash" :summary "* A quick. powerful smashing maneuver usually performed 'sidearm' with an ax, club, or staff. * Requires: [Blunt Weapon] +1 Initiative +1 Damage Criticals - [Knockback]") "Blade Barrier" (ability :name "Blade Barrier" :summary "* Creates a 3 space wide [Wall] directly in front of the unit by rapidly swinging the blade in a flashy display. Anything crossing this wall is subject to an [Opportunity Attack]." :titles "Wall of Swords") "Blind Fighting" (ability :name "Blind Fighting") "Combat Sense" (ability :name "Combat Sense") "Continuous Cut" (ability :name "Continuous Cut" :reference "The Flowing Water Cut is used when you are struggling blade to blade with the enemy. When he breaks and quickly withdraws trying to spring with his sword, expand your body and spirit and cut him as slowly as possible with your long sword, following your body like stagnant water. - Miyamoto Mushashi, The Book of Five Rings" :summary "* [Reaction]: [+1 Defense]. If you are not hit, you may immediately attack as a free action at [-1 Attack]." :titles "Flowing Water Cut") "Dash Attack" (ability :name "Dash Attack" :summary "* [Requires]: May only move in a straight line this turn. * [Action]: [-1 Attack], May attack any number of adjacent opponents along path each at a cumulative -1.") "Dazing Blow" (ability :name "Dazing Blow" :summary "-2 Damage Damage - [Stun] Criticals - [Stun]" :titles "Pommel Strike") "Dual Wield" (ability :name "Dual Wield" :reference "* Not used on the battlefield where a shield would be more practical. * Used primarily for parrying during one on one duels. * Two longsword duelling was done by very skilled fighters in Italian duelling. * Dual katana Japanese styles also exist." :summary "* Using a Dagger, Hand Axe or Hammer in the off hand.") :Feint (ability :name "Feint" :summary "* Feints are maneuvers designed to distract or mislead, done by giving the impression that a certain maneuver will take place, while in fact another, or even none, will." :titles "Kizeme") "Fend Off" (ability :name "Fend Off" :summary "* [Requires]: Weapon with [Reach] * [Reaction]: If you hit with [Fend Off], the opponent may not move any closer to you this turn.") "Fire and Stones Cut" (ability :name "Fire and Stones Cut" :reference "The Fires and Stones Cut means that when the enemy's sword and your sword clash together you cut as strongly as possible without raising the sword even a little. This means cutting quickly with the hands, body and legs - all three cutting strongly. If you train well enough you will be able to strike strongly. - Miyamoto Mushashi, The Book of Five Rings" :summary "* [Reaction]: [+1 Defense] * [Action]: [+1 Attack], if you used this ability to [React] last turn.") :Fleche (ability :name "Fleche" :summary "* A [Lunge] forward where the attacker continues to move forward past the defender to avoid a [Riposte] or Counter Attack. -1 Initiative +1 Move - May only move straight forward. +1 Damage") "Follow Through" (ability :name "Follow Through" :summary "* [Action]: If you hit with this ability, you may immediately turn to the left or right and attack a target in the next adjacent space. This may be repeated any number of times at [-1 Attack] per target after the first though each additional target must be in the same direction.") :Hamstring (ability :name "Hamstring" :summary "* Attack the legs to slow the opponent. * [Action] -1 Accuracy Criticals - [Cripple]") :Impale (ability :name "Impale" :summary "* [Requires]: Spear * [Action] -1 Accuracy Criticals - [Piercing]") :Lunge (ability :name "Lunge") "Offhanded Fighting" (ability :name "Offhanded Fighting" :summary "* [Action]: Normal Attack take a -2 penalty if performed with the non primary hand. This ability negates that penalty when using this skill in the off hand.") :Parry (ability :name "Parry" :summary "* The fighter uses his weapon to block an opponent's attack. * [Reaction] +1 Initiative +2 Defense") "Piercing Strike" (ability :name "Piercing Strike" :summary "* [Action]: Trades damage to increase armor penetration.") "Rapid Strike" (ability :name "Rapid Strike" :reference "In One Timing means, when you have closed with the enemy, to hit him as quickly and directly as possible, without moving your body or settling your spirit, while you see that he is still undecided. The timing of hitting before the enemy decides to withdraw, break or hit, to be able to hit in the timing of an instant. - Miyamoto Mushashi, The Book of Five Rings" :summary "* [Requires]: Wear loose clothing or less. (Armor Penalty = 0). * [Action]: Speed +1, Attack -1" :titles "In One Timing, Lightning Blow") :Riposte (ability :name "Riposte" :reference "When your swords clash together, in one motion when your sword springs away from theirs, use a continuous motion to slash their head, body and legs." :summary "* Speedy attack that can only be performed after a [Parry] or a [Block]. * [Requires]: Previous Action was [Parry] or [Block] +2 Initiative +2 Attack" :titles "Counter Strike") "Set Against Charge" (ability :name "Set Against Charge") :Slash (ability :name "Slash" :summary "* A powerful blow with a cutting weapon. +1 Initative -1 Move +1 Accuracy Criticals - [Bleed]") "Stunning Blow" (ability :name "Stunning Blow" :summary "* [Attack]: Trades lethal damage for stunning damage.") :Sweep (ability :name "Sweep" :summary "* Attack the legs to trip the opponent. +1 Initative -1 Move -1 Damage Criticals - [Knockdown]" :titles "Trip") "There are Many Enemies" (ability :name "There are Many Enemies" :reference "When you are fighting one against many, draw both sword and companion sword and assume a wide-stretched left and right attitude. The spirit is to chase the enemies around from side to side, even though they come from all four directions. Observe their attacking order, and go to meet first those who attack first. Sweep your eyes around broadly, carefully examining the attacking order, and cut left and right alternately with your swords. Waiting is bad. Always quickly re-assume your attitudes to both sides, cut the enemies down as they advance, crushing them in the direction from which they attack. Whatever you do, you must drive the enemy together, as if tying a line of fishes, and when they are seen to be piled up, cut them down strongly without giving them room to move. - Miyamoto Mushashi, The Book of Five Rings" :summary "* [Requires]: [Duel Wield] * [Defense]: If [Surrounded], ignore opponents in front arc when determining [Surrounded] defense penalty.") :Thrust (ability :name "Thrust" :summary "+1 Initiative +1 Move Critcals - [Piercing]") "To Apply Stickiness" (ability :name "To Apply Stickiness" :reference "When the enemy attacks and you also attack with the long sword, you should go in with a sticky feeling and fix your long sword against the enemy's as you receive his cut. The spirit of stickiness is not hitting very strongly, but hitting so that the long swords do not separate easily. It is best to approach as calmly as possible when hitting the enemy's long sword with stickiness. The difference between 'Stickiness' and 'Entanglement' is that stickiness is firm and entanglement is weak. - Miyamoto Mushashi, The Book of Five Rings") "Weapon Block" (ability :name "Weapon Block" :summary "* Deflect, catch, or even turn strike back with a weapon used against the fighter. * This ability provides a second Defense roll against a weapon attack before the regular Defense roll. * [Reaction] +2 Initiative +1 Accuracy 0 Damage - Any successes become -Damage to the weapon. If the weapon has 0 Damage remaining, it is caught. Criticals - Any Criticals become -2 Damage to the weapon. If the weapon has 0 Damage remaining and there are still Criticals, the weapon may be immediately used at +[Criticals] Accuracy. Note: The weapon remains in the hands of the attacker.") "Whirlwind Attack" (ability :name "Whirlwind Attack" :summary "* Allows multiple attacks to different targets by trading accuracy for extra attacks.")) :specialtymap (specialtymap :Bladedancer (specialty :name "Bladedancer" :summary "* A combat technique focusing on elegant moves that efficiently combine attack and defense. Heavy armor may not be used with this technique.") :Fensing (specialty :name "Fensing" :summary "* A combat technique focusing on long quick blades like rapiers and epees." :titles "Fenser") "Sword Saint" (specialty :name "Sword Saint" :summary "* A combat technique focusing almost exclusively on mastery of the sword." :titles "Kensai, Kensei") :Axes (specialty :name "Axes" :reference "* Run to the bedroom, In the suitcase on the left You'll find my favorite axe. Don't look so frightened This is just a passing phase, One of my bad days. - Pink Floyd, One of My Turns" :titles "Axeman") "Flexible Weaponry" (specialty :name "Flexible Weaponry" :summary "* Backlash, Disarm, Trip" :titles "Hangman, Strangler") :Hammers (specialty :name "Hammers" :summary "* War hammers were developed as a consequence of the ever more prevalent metal armors of the medieval battlefields during the 14th and 15th centuries. Swords were of little use against these armors. The war hammer could deal blows of tremendous force to the target, especially when mounted on a pole, and by impact alone do damage without penetrating the armor. The spike end could be used for grappling the target's armour, reins, or shield, or could be turned in the direction of the blow to pierce even heavy armor. Against mounted opponents, the weapon could also be directed at the legs of the horse, toppling the armored foe to the ground where he could be more easily attacked. * See Arms and Armor for weapons") "Short Blades" (specialty :name "Short Blades" :summary "* Includes Short Swords, Daggers, Stilettos, Machetes, Large Kitchen Knives, etc.") :Polearms (specialty :name "Polearms" :summary "Fend Off" :titles "Glaivemaster, Halberdier, Poleman") :Spears (specialty :name "Spears" :summary "Fend Off, Impale, Set Against Charge, Shield Snare" :titles "Lancer, Javelineer, Myrmidon, Peltast, Pikeman, Spartan, Spearman, Velite") :Staves (specialty :name "Staves" :summary "* This specialty includes long staves and short sticks. Staves have longer reach than most weapons while fighting sticks attack with great speed. * [Bash], [Dazing Blow], [Disarm], [Fend Off], [Fleche], [Parry], [Riposte], [Sweep]" :titles "Arnis, Bojutus, Escrima, Kali, Stick Fighting") :Swords (specialty :name "Swords" :reference "The Book of Five Rings - Miyamoto Mushashi The Gaze * The gaze should be large and broad. This is the twofold gaze 'Perception and Sight'. Perception is strong and sight weak. * In strategy it is important to see distant things as if they were close and to take a distanced view of close things. It is important in strategy to know the enemy's sword and not to be distracted by insignificant movements of his sword. The gaze is the same for single combat and for large-scale combat. * It is necessary in strategy to be able to look to both sides without moving the eyeballs. You cannot master this ability quickly. Learn what is written here: use this gaze in everyday life and do not vary it whatever happens. The Five Attitudes * The five attitudes are: Upper, Middle, Lower, Right Side, and Left Side. These are the five. * Although attitude has these five dimensions, the one purpose of all of them is to cut the enemy. * There are none but these five attitudes. * Whatever attitude you are in, do not be conscious of making the attitude; think only of cutting. * Middle Attitude - Confront the enemy with the point of your sword against his face. When he attacks, dash his sword to the right and 'ride' it. Or, when the enemy attacks, deflect the point of his sword by hitting downwards, keep your long sword where it is, and as the enemy renews the attack cut his arms from below. * When you master my Way of the long sword, you will be able to control any attack the enemy makes. I assure you, there are no attitudes other than the five attitudes of the long sword of NiTo. * Upper Attitude - From the Upper attitude cut the enemy just as he attacks. If the enemy evades the cut, keep your sword where it is and, scooping from below, cut him as he renews the attack. * You will always win with the five long sword methods. You must train repeatedly. * Lower Attitude - Adopt the Lower attitude, anticipating scooping up. When the enemy attackes, hit his hands from below. As you do so, he may try to hit your sword down. If this is the case, cut his upper arm(s) horizontally with a feeling of 'crossing'. This means that from the Lower attitudes you hit the enemy at the instant that he attacks. You will encounter this method often, both as a beginner and in later strategy. * Left Side Attitude - Adopt the Left Side attitude. As the enemy attacks, hit his hands from below. If as you hit his hands he attempts to dash down your sword, with the feeling of hitting his hands, parry the path of his long sword and cut across from above your shoulder. Through this method you win by parrying the line of the enemy's attack. * Right Side Attitude - In the fifth approach, the sword is in the Right Side attitude. In accordance with the enemy's attack, cross your sword from below at the side to the Upper attitude. Then cut straight from above. * Cut and Slash - To cut and slash are two different things. Cutting, whatever form of cutting it is, is decisive, with a resolute spirit. Slashing is nothing more than touching the enemy. Even if you slash strongly, and even if the enemy dies instantly, it is slashing. When you cut, your spirit is resolved. You must appreciate this. If you first slash the enemy's hands or legs, you must then cut strongly. Slashing is in spirit the same as touching. When you realise this, they become indistinguishable. Learn this well." :summary "* Melee - [Abdomen Timing of Two], [Continuous Cut], [Dash Attack], [Dazing Blow], [Fleche], [Fire and Stones Cut], [Parry], [Riposte], [Slash], [There Are Many Enemies], [Thrust], [To Apply Stickiness]" :titles "Bushi, Fencer, Fencing, Kendo, Kenjutsu, Kensei, Ronin, Sword Saint, Samurai, Swordsman"))) :Ranged (skill :name "Ranged" :reference "* Good. Bad. I'm the guy with the gun. - Ash, Army of Darkness" :titles "Archer, Javelineer, Slinger" :abilitymap (abilitymap "Arcing Fire" (ability :name "Arcing Fire" :summary "* [Requires]: Bow or Javelin * May fire over other units that block Line of Sight.") "Barbed Javelin" (ability :name "Barbed Javelin" :summary "* [Requires]: Javelin * Criticals vs Large units are [Rage] Tokens.") "Bowel Raker" (ability :name "Bowel Raker" :summary "* +1 [Bleeding] * -1 [Piercing]" :titles "Serrated Arrow") "Deadly Arrow" (ability :name "Deadly Arrow" :summary "* [Requires]: Bow or Crossbow * Increase weapon range by 50% and choose [Hit Location]") "Double Shot" (ability :name "Double Shot" :summary "* -2 [Attack] * -1 [Piercing] * May attack two targets in same [Arc]." :titles "Double Throw") "Explosive Shot" (ability :name "Explosive Shot" :summary "* [Requires]: Bow or Crossbow") "Flaming Arrow" (ability :name "Flaming Arrow" :summary "* [Requires]: Bow or Crossbow") :Fletching (ability :name "Fletching" :summary "* The art of making arrows. High quality or specialized arrows are quickly used up and often impractical to buy. Creating your own is often a very practical solution." :titles "Bowyer") "Knife Throwing" (ability :name "Knife Throwing") "Piercing Shot" (ability :name "Piercing Shot" :summary "* [Requires]: Bow or Crossbow * [Attack]: [+1 Armor Piercing]") :Richochet (ability :name "Richochet" :summary "* [Requires]: Thrown Object") "Shield Snare" (ability :name "Shield Snare" :summary "* [Requires]: Javelin, Target with shield * [Attack]: Criticals are [Encumberance] Tokens.") "Signal Shot" (ability :name "Signal Shot" :summary "* Alert allied units by sending a prearranged signal. This can be flaming arrow at night, smoking arrow, singing arrow, etc. * [Requires]: Bow or Crossbow * [Action]: For the rest of the turn, other units adjacent to this unit may be treated as if under the [Sphere of Command] of any allied Commander.") "Stunning Throw" (ability :name "Stunning Throw" :summary "* [Requires]: Thrown Object * Trades lethal damage for stunning damage.")) :specialtymap (specialtymap :Archery (specialty :name "Archery" :summary "* Bowel Raker, Double Shot, Flaming Arrow" :titles "Archer, Archer Elite, Bowman, Crossbowman, Longbowman") "Thrown Weapons" (specialty :name "Thrown Weapons" :reference "You? You're very good. But me? I'm magic. - Bullseye, Daredevil Comics" :summary "* Barbed Javelin, Double Shot, Knife Throwing, Precision Throw, Shield Snare" :titles "Knife Thrower, Javelineer, Slinger"))) :Firearms (skill :name "Firearms" :titles "Crackshot, Marksman, Rifleman, Sharpshooter, Sniper" :abilitymap (abilitymap :Anti-Personnel (ability :name "Anti-Personnel" :summary "* [Action]: [+1 Damage] or [-1 Damage] vs. 2 or more Armor" :titles "Hollow Point") "Armor Piercing" (ability :name "Armor Piercing" :summary "* [Action]: Enemy at [-2 Armor]" :titles "Depleted Uraniumn") :Autofire (ability :name "Autofire" :summary "* [Requires]: Weapon with [Autofire] -1 [Attack] * [Action]: Target 2 adjacent units.") "Chemical Rounds" (ability :name "Chemical Rounds" :summary "* [Action]: [-1 Damage], [Critical Hits] are [Acid]") "Fast Draw" (ability :name "Fast Draw" :summary "* [Requires]: Hand weapon * Spend 1 Speed to draw a Hand weapon from holster to hip where he can [Shoot From The Hip].") "Gyrojet Rounds" (ability :name "Gyrojet Rounds" :summary "* [Action]: [+1 Damage] at Long Range, [-1 Damage] at Short Range" :titles "Rocket Rounds") "High Explosive Rounds" (ability :name "High Explosive Rounds" :summary "* [Action]: Use [Blast] rules for targetting and damage." :titles "Explosive Rounds") :Hipshoot (ability :name "Hipshoot") "Non-Lethal Rounds" (ability :name "Non-Lethal Rounds" :summary "* [Action]: [-2 Damage] vs. 2 or more Armor. Half of all [Damage] is [Stun] instead." :titles "Rubber Bullets") "Paint Rounds" (ability :name "Paint Rounds" :summary "* [Action]: [0 Damage], [Critical Hits] are [Stun]" :titles "Paintball") "Pin Down" (ability :name "Pin Down") "Rapid Fire" (ability :name "Rapid Fire") :Scattershot (ability :name "Scattershot" :summary "* Choose a target starting from the closest. * If a hit is scored, roll another attack on the same target. * If no hit scored, roll against next target. * -1 for each Space of Range (Cone), -1 per roll (cumulative, inclusive). * Criticals can be used for additional damage rolls (multiple Hits) * If target was [Armor], that Armor is at +2 vs this attack" :titles "Glaser, Shot") :Sniper (ability :name "Sniper" :reference "* The snipe (a family of shorebirds) is difficult to catch for experienced hunters, so much so that the word 'sniper' is derived from it to refer to anyone skilled enough to shoot one. * I aim to win and my aim... is Excellent. - Caitlyn, Runeterra" :summary "* [Requires]: Long Range Weapon * Increase weapon range by 50% and choose [Hit Location]") "Supressive Fire" (ability :name "Supressive Fire" :summary "* Firing weapons at enemy forces with the primary goal of forcing them to remain under cover. * [Requires]: Weapon with [Autofire] * [Action]: Target a unit that has not been activated this turn, all [Hits] and [Critical Hits] are [Stun] tokens. +1 Attack" :titles "Covering Fire") "Tracer Rounds" (ability :name "Tracer Rounds" :summary "* [Requires]: [Auto], Must attack same target on subsequent round. * [Action]: [+1 Attack], [-1 Damage].") "Tracking Rounds" (ability :name "Tracking Rounds") :Auto (ability :name "Auto" :summary "+1 Cost * Criticals can be used for additional damage rolls (multiple hits).") :Blast (ability :name "Blast") :Bombardment (ability :name "Bombardment") :Capacitors (ability :name "Capacitors" :summary "* Uses capacitors that can recharge 1 shot a turn from a power source rated at the same power level as a single shot. Cannot be used with lower energy power sources.") :Electroshock (ability :name "Electroshock" :titles "Taser") "Extra Ammo" (ability :name "Extra Ammo" :summary "* 2x number of shots, each time this modifier is taken.") "Flash Surpressor" (ability :name "Flash Surpressor" :summary "* Reduces the muzzle flare of the weapon making it more difficult to visually locate the shooter.") "Gun Mount" (ability :name "Gun Mount" :titles "Bipod, Tripod") :Overcharge (ability :name "Overcharge" :summary "* [Action]: Consume 2 shots to to 1 extra damage. Then Damage is -1 until repaired.") "Overload Weapon" (ability :name "Overload Weapon" :summary "* Detonate the entire weapon magazine (and the weapon) as an explosive with force equal to the total power in the magazine.") :Rechargable (ability :name "Rechargable" :summary "* Uses batteries that can be slowly recharged from any power source.") "Recoil Compensator" (ability :name "Recoil Compensator" :summary "* Reduces the 'kick' of the weapon and therefore reduces the penalty for continuous fire.") :Silencer (ability :name "Silencer") "Smoke Generator" (ability :name "Smoke Generator") "Targeting Laser" (ability :name "Targeting Laser") "Telescopic Sight" (ability :name "Telescopic Sight" :summary "Reduces penalties for Medium Range to Short Range and Long Range to Medium Range") :Turret (ability :name "Turret" :image "Tokens/Arrow.png" :summary "+1 Cost * Turret mounted weapons may turn their turret toward any direction and fire from the side the turret is facing. * Turrets are normally assumed to be facing forward. At the beginning of its [Action], a unit may change the turret facing by 1 side (Use a [Vector] Token) indicate where the Turret is pointing.")) :specialtymap (specialtymap "Energy Weapons" (specialty :name "Energy Weapons" :reference "Whoa, whoa, whoa! Nice shootin', Tex! - Ghostbusters") :Handguns (specialty :name "Handguns") :Rifles (specialty :name "Rifles") :Shotguns (specialty :name "Shotguns"))) :Gunnery (skill :name "Gunnery" :summary "* Gunnery skill cannot exceed level 5 - Because advanced weapons are mostly point and shoot, weapon skill has less to do with the gunner and more to do with the weapon and its control system. Further, advanced weapons technologies come in a multitude of variations with constantly changing interfaces therefore it is very difficult to dedicate oneself to a single system to become an expert. * See Arms and Armor for weapons" :titles "Artillerist, Bombardier, Field Ops, Gunner" :abilitymap (abilitymap "Air Burst" (ability :name "Air Burst") :Barrage (ability :name "Barrage" :summary "A barrage is a line or barrier of exploding shells from a large number of guns firing continuously. Its purpose is to deny or hamper enemy passage. It contrasts with a concentration, in which all the guns aim at the same small area. The barrage was developed in World War I, with the infantry following the advancing barrage. Its employment in this way recognised the importance of artillery fire in neutralising, rather than destroying, the enemy. A creeping barrage immediately followed by an infantry assault could be far more effective than weeks of preliminary bombardment.") "Forward Observer" (ability :name "Forward Observer" :summary "* [Action]: When unit has [Line of Sight] on a opponent, any number of units with [Indirect Fire] may attack that unit even if they do not have [Line of Sight].") "Indirect Fire" (ability :name "Indirect Fire" :summary "-2 Attack -2 Damage * Other units do not block [Line of Sight]. * See: [Forward Observer] * See: [HE - High Explosives]") "Point Defense" (ability :name "Point Defense") :Salvo (ability :name "Salvo" :summary "* The simultaneous discharge of weapons, rather than scattered 'fire at will'. * Up to 10 weapons of the same type can be in 1 Salvo. * All targets in the space are attacked.")) :specialtymap (specialtymap :Cannons (specialty :name "Cannons") :Flamethrowers (specialty :name "Flamethrowers") :Machineguns (specialty :name "Machineguns"))) "Physical Power" (skill :name "Physical Power" :summary "* This skill is used when manifesting and controlling a [Power] that directly affect physical objects. * Physical Powers must have clear range and line of sight on a target." :stat "Body" :abilitymap (abilitymap "Gunnery Power" (ability :name "Gunnery Power" :summary "* Use [Gunnery] and a Gunnery item instead of [Physical Power] to manifest a [Physical] [Ability] on contact.") "Firearm Power" (ability :name "Firearm Power" :summary "* Can use [Firearms] and Firearm item instead of [Physical Power] to manifest a [Physical] [Ability] on contact.") "Close Combat Power" (ability :name "Close Combat Power" :summary "* Can use [Close Combat] instead of [Physical Power] to manifest a [Physical] [Ability] on contact.") "Melee Power" (ability :name "Melee Power" :summary "* Use [Melee] and a Melee item instead of [Physical Power] to manifest a [Physical] [Ability] on contact.") "Ranged Power" (ability :name "Ranged Power" :summary "* Can use [Ranged] and a Ranged item of [Physical Power] to manifest a [Physical] [Ability] on contact."))) "Mental Power" (skill :name "Mental Power" :summary "* This skill is used when manifesting and controlling a [Power] that directly affect the [Mind] of targets. * Mental Powers must have range and be able to 'see' the target." :titles "Mental Challenge" :stat "Mind" :abilitymap (abilitymap "Mental Grip" (ability :name "Mental Grip") "Mental Gymnastics" (ability :name "Mental Gymnastics") "Mind Whip" (ability :name "Mind Whip") "Psionic Blade" (ability :name "Psionic Blade") "Psionic Knife" (ability :name "Psionic Knife") "Intellect Fortress" (ability :name "Intellect Fortress"))) "Psychic Power" (skill :name "Psychic Power" :summary "* This skill is used when manifesting and controlling a [Power] that directly affect the [Will] of targets. * Psychic Powers must have range and see or 'know' the target." :titles "Psychic Combat, Psychological Warfare, Soul Combat, Spirit Combat, Test of Will" :stat "Will" :abilitymap (abilitymap "Ego Whip" (ability :name "Ego Whip") "Psychic Knife" (ability :name "Psychic Knife") "Tower of Iron Will" (ability :name "Tower of Iron Will"))) :Command (skill :name "Command" :reference "* Generals are in the business of getting people killed. Captains like to keep theirs alive. You wanna put on a parade? Go find a general. You wanna fight your way home? Talk to me. - Obregon Kaine, Negation Comic * Well hello mister fancy pants. I got news for you pal. You ain't leading but two things right now: Jack and Shit and Jack left town. - Ash, Army of Darkness * And when Alexander saw the breadth of his domain, he wept for there were no more worlds to conquer. - Hans Gruber, Die Hard" :titles "Captain, Castellan, Commander, Drillmaster, Drill Sergeant, Major, Overlord, Sergeant, Warchief, Warlord" :stat "Mind" :abilitymap (abilitymap "Call to Arms" (ability :name "Call to Arms" :reference "Unite. Take up arms. Stand shoulder to shoulder with your brothers and sisters. And break free from the cold shackles of oppression. Liberty for all is more noble than the preservation of one's soul. Destiny and valor will meet at the end of the sword. And the tales of heroic sacrifice will be the legend of a new age. There will be no respite. There will be no surrender. Only glory and honor. The price will be high for the greatest prize of all. Stand and be counted among those that dared. Those who dared to fight for their freedom. - Glass Fleet" :summary "Gather a war party from the populace") "Chain of Command" (ability :name "Chain of Command" :summary "* [Action]: [Activate] up to [Command] units directly or indirectly adjacent to this unit. These units (including this one) may spend [Speed] or [Actions] in any order this [Turn]. * [Interrupt]: May not be used as an Interrupt.") :Rally (ability :name "Rally"))) :Military (skill :name "Military" :reference "* He can't make that kind of decision. He's just a grunt! No offense. None taken - Burke and Hicks, Aliens * I think we'd better split up...Yeah... we can do more damage that way. - Ghostbusters * If ten times the enemy's strength, surround them; If five times, attack them; If double, divide them; If equal, be able to fight them; If fewer, be able to evade them; If weaker, be able to avoid them. - Sun Tzu * Warfare is the art of deception. Thus although you are capable, display incapability to them. When your objective is nearby, make it appear distant; when it is far away, create the illusion of being nearby. - Sun Tzu, The Art of War" :titles "Admiral, Brigade, Brigadier, Cadet, Centurion, Colonel, Commander, Commando, Conscript, Corporal, Field Marshal, Footman, Gamesman, General, Grunt, High Guard, Honor Guard, Infantry, Legionnaire, Lieutenant, Praetor, Praetorian Guard, Reserves, Royal Guard, Soldier, Soldier of Fortune, Strategist, Tactician, Vanguard" :stat "Will" :abilitymap (abilitymap "Airborne Assault" (ability :name "Airborne Assault") "Amphibious Assault" (ability :name "Amphibious Assault") :Besiege (ability :name "Besiege") "Bomb Disposal" (ability :name "Bomb Disposal" :reference "* I'll tell you a dirty little secret. When you're in the middle of an explosion, it's the ultimate rush. - Haggerty, Obliterated * Who has one thumb and just saved Las Vegas? This guy! - Hagerty, Obliterated") "Close Assault" (ability :name "Close Assault" :summary "* [Action]: If a [Vehicle] is adjacent to this unit, you may target the Top Armor. If the unit has explosives, it may target the Under Armor.") "Combat Driver" (ability :name "Combat Driver" :summary "* Experienced in fighting in a car.") :Demolitions (ability :name "Demolitions" :summary "* Experienced with setting up large explosives to destroy large structures.") "Divide and Conquer" (ability :name "Divide and Conquer") "Diversionary Tactics" (ability :name "Diversionary Tactics") :Explosives (ability :name "Explosives" :summary "* Experienced using various small explosives in combat.") "Field Fortifications" (ability :name "Field Fortifications") "Formation: Back to Back" (ability :name "Formation: Back to Back" :summary "* [Formation]: Not strictly a formation, units with their backs against each other largely protect each other's back.") "Formation: Cover" (ability :name "Formation: Cover" :summary "* [Formation]: Not strictly a formation, units in Cover formation stay close enough together to protect each other's sides.") "Formation: March" (ability :name "Formation: March" :summary "* [Formation]: Units move in columns. * [+1 Speed]") "Formation: Parade" (ability :name "Formation: Parade" :summary "* [Formation]: A showy formation designed to look good. Has no use in battle. * [+ 1 Intimidation]") "Formation: Phalanx" (ability :name "Formation: Phalanx" :reference "* With his friends jostling and pushing on both sides and behind, and his enemies forming a solid wall in front of him, the hoplite had little opportunity for feats of technique and weapon skill, but great need for commitment and mental toughness. The hoplites had to trust their neighbors for mutual protection, so a phalanx was only as strong as its weakest elements. Its effectiveness depended on how well the hoplites could maintain this formation while in combat, and how well they could stand their ground, especially when engaged against another phalanx. The more disciplined and courageous the army, the more likely it was to win. The Greek word dynamis, the 'will' or 'ability to fight,' was used to express the drive that kept hoplites in formation." :summary "* [Formation]: Focuses on offense using Melee attacks with Reach. * [Requires]: At least half must have Weapons with Reach 2+. * [+1 Attack], [+1 Defense] from Front * [-1 Defense] from Rear") "Formation: Shield Wall" (ability :name "Formation: Shield Wall" :summary "* [Formation]: Uses shields to form a wall. * [Requires]: At least half must have Shields. +1 Defense from Front.") "Formation: Skirmish" (ability :name "Formation: Skirmish" :reference "Acting as light infantry with their light arms and minimal armor, they could run ahead of the main battle line, release a volley of arrows, slingshots or javelins, and retreat behind their main battle line before the clash of the opposing main forces. The aims of skirmishing were to disrupt enemy formations by causing casualties before the main battle, and to tempt the opposing infantry into attacking prematurely, throwing their organization into disarray. Skirmishers could also be effectively used to surround opposing soldiers in the absence of friendly cavalry." :summary "* [Formation]: Units move in loose shapes. * [Requires]: Only [Light Infantry]. * [Move]: Ignore 1 [Terrain Penalty]. * [+1 Defense] vs Ranged or Large Units * [+1 Defense] when in Terrain with Defense bonus * [-1 Defense] vs Small Melee and Close Combat Units" :titles "Skirmisher") "Formation: Testudo" (ability :name "Formation: Testudo" :image "Skills/Testudo.jpg" :summary "* [Formation]: Uses shields to form a shell around a unit. * [Requires]: At least half must have Shields. * [+2 Defense] vs Ranged * Shields protect all sides * Cannot Attack" :titles "Tortoise Formation, Turtle Up") "Formation: Tight" (ability :name "Formation: Tight" :summary "* [Formation]: Units stay tightly packed to maximize Melee defense. * [+1 Defense] vs Melee and Close Combat. * [-1 Defense] vs Ranged") "Formation: Wedge" (ability :name "Formation: Wedge" :summary "* [Formation]: Units move in triangle and focus on breaking enemy formations. * [+1 Retreat] Token if unit inflicts at least 1 [Retreat].") :Fortifications (ability :name "Fortifications") "Halo Drop" (ability :name "Halo Drop") "Jump Suit Combat" (ability :name "Jump Suit Combat") "Military Vehicle" (ability :name "Military Vehicle" :summary "* Every vehicle unit is assumed to have this ability. Units that are not vehicles must take this ability for each vehicle.") "Mine Clearing" (ability :name "Mine Clearing") "Mine Laying" (ability :name "Mine Laying") "Mobile Infantry" (ability :name "Mobile Infantry" :summary "* Experienced with powered armor.") "Orbital Halo Drop" (ability :name "Orbital Halo Drop") "Parachute Assault" (ability :name "Parachute Assault") :Sapping (ability :name "Sapping" :reference "* If it was important, then they should have built it better. - Desert Naturalist, Runeterra") "Space Combat" (ability :name "Space Combat") "Urban Assault" (ability :name "Urban Assault") "Wingsuit Combat" (ability :name "Wingsuit Combat")) :specialtymap (specialtymap :Siegecraft (specialty :name "Siegecraft" :summary "* Besiege * Fortifications * Sapping" :titles "Sapper"))))))) "Early Weaponry" (chapter :name "Early Weaponry" :sectionmap (sectionmap "Early Firearms" (section :name "Early Firearms" :itemmap (itemmap "Matchlock Pistol" (item :name "Matchlock Pistol" :summary "1400s") "Matchlock Rifle" (item :name "Matchlock Rifle" :summary "1400s") "Wheellock Pistol" (item :name "Wheellock Pistol" :summary "1500s") "Wheellock Rifle" (item :name "Wheellock Rifle" :summary "1500s") "Flintlock Pistol" (item :name "Flintlock Pistol" :summary "1600s") "Flintlock Rifle" (item :name "Flintlock Rifle" :summary "1600s") "Dueling Pistol" (item :name "Dueling Pistol" :summary "1770") "Brown Bees Rifle" (item :name "Brown Bees Rifle" :summary "1700s") "Percussion Pistol" (item :name "Percussion Pistol" :summary "1800s") "Percussion Rifle" (item :name "Percussion Rifle" :summary "1800s"))))) "Modern Equipment" (chapter :name "Modern Equipment" :sectionmap (sectionmap "Weapons of Mass Destruction" (section :name "Weapons of Mass Destruction" :itemmap (itemmap "Agent Orange" (item :name "Agent Orange") :Napalm (item :name "Napalm") "Cluster Bomb" (item :name "Cluster Bomb") "Smart Bomb" (item :name "Smart Bomb") "Block Buster" (item :name "Block Buster") "Bunker Buster" (item :name "Bunker Buster") "Fuel Air Explosive" (item :name "Fuel Air Explosive") "Naval Mine" (item :name "Naval Mine") "Nuclear Bomb" (item :name "Nuclear Bomb") "Fusion Bomb" (item :name "Fusion Bomb") "Dirty Bomb" (item :name "Dirty Bomb") "Nerve Gas Bomb" (item :name "Nerve Gas Bomb") :MIRV (item :name "MIRV") "Neutron Bomb" (item :name "Neutron Bomb") "Plague Bomb" (item :name "Plague Bomb") "Tactical Nuclear Bomb" (item :name "Tactical Nuclear Bomb") "Tactical Nuclear Cruise Missile" (item :name "Tactical Nuclear Cruise Missile") "Strategic Nuclear Bomb" (item :name "Strategic Nuclear Bomb") "Nuclear Cruise Missile" (item :name "Nuclear Cruise Missile") "Nuclear Ballistic Missile" (item :name "Nuclear Ballistic Missile"))))) "Advanced Weaponry" (chapter :name "Advanced Weaponry" :sectionmap (sectionmap "Futuristic Weapons of Mass Destruction" (section :name "Futuristic Weapons of Mass Destruction" :itemmap (itemmap "Spinal Nava Cannon" (item :name "Spinal Nava Cannon") "Spinal Rail Gun" (item :name "Spinal Rail Gun") "Spinal Wave Cannon" (item :name "Spinal Wave Cannon" :summary "* An enormously powerful energy cannon capable of enormous damage over a large area." :titles "Death Star Cannon, Wave Motion Gun")) :unitmap (unitmap "Star Mine" (unit :name "Star Mine" :summary "* Star Mines are basically Star Torpedoes that have been left floating in space near likely enemy traffic. The mines are smart and will only attack selected targets and can act as spy satellites by transmitting what their sensors are picking up. When given the order, the Star Mine rockets off toward its victim. Though inefficient in space because of the vast distances, they still can be effective by limiting an opponent's options or when used as traps at key locations." :titles "Space Mine") "Sentry Spy Satellite" (unit :name "Sentry Spy Satellite" :summary "* Sentry Spy Satellites are small disposable surveillence satellites that are hidden in asteroid or debris fields to monitor activity and transmit that information back home. They are sometimes armed with a Star Torpedo for a surprise attack.") "Star Torpedo" (unit :name "Star Torpedo" :summary "* Star Torpedoes carry Nuclear weapons (tactical or greater). In space, nuclear weapons produce no shockwave, just intense radiation. Even direct hits are not guaranteed to pierce the diamond hard ceramic armor of modern warships, so penetration is critical.") "Colony Drop" (unit :name "Colony Drop" :reference "Mobile Suit Gundam") "Planet Bomb" (unit :name "Planet Bomb" :reference "Star Blazers, Starship Troopers" :summary "* Asteroids or comets redirected to fall on a planet.") "Plague Planet Bomb" (unit :name "Plague Planet Bomb" :summary "* An enormous, genocidal planet bomb that releases a series of infectious diseases to infect a population. Victims do not immediately show signs of infection to maximize the contagion and paranoia.") "Rage Planet Bomb" (unit :name "Rage Planet Bomb" :summary "* An enormous, genocidal planet bomb that releases a series of parasites that turns infected creatures into rabid killers who spread the infection.") "Famine Planet Bomb" (unit :name "Famine Planet Bomb" :summary "* An enormous, genocidal planet bomb that releases a series of diseases that attack the food harvest of a planet attempting to break the food chain and cause mass starvation or force compliance.") "Pestilence Planet Bomb" (unit :name "Pestilence Planet Bomb" :summary "* An enormous, genocidal planet bomb that releases a series of parasites that infect insects, birds, and vermin. These creatures gain accelerated reproduction and high aggression to attack food supplies and the general population.") "Terraforming Planet Bomb" (unit :name "Terraforming Planet Bomb" :reference "Genesis - Star Trek II") "Hellbore Planet Bomb" (unit :name "Hellbore Planet Bomb" :summary "* A missile that detonates a series of shaped nuclear blasts to tunnel into a geological fault or a volcano where it attempts to cause a massive natural disaster.") "Planet Buster" (unit :name "Planet Buster" :reference "Anti-Matter Missile - Star Blazers" :summary "* A missile designed to be part of a massive bombardment to shatter a planet's crust and return it to a molten state. Already unstable planets may break up into rubble.") "Starkiller Missile" (unit :name "Starkiller Missile" :reference "Sunshine" :summary "* A missile designed to be part of a massive bombardment to disrupt the nuclear chain reaction in a star. This can result in massive solar flares, a cooling of the star, or cause the star to go nova depending on the age and size of the star."))))))))
nx/tactics/books/combat / tacticsbook
Description:
Function Name:
  • tacticsbook
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func tacticsbook : base/book (book :name "Combat" :image "Warrior.jpg" :chaptermap (chaptermap "Combat Overview" (chapter :name "Combat Overview" :sectionmap (sectionmap "Aiming and Range" (section :name "Aiming and Range" :summary "* It takes 3 seconds to aim a weapon at a target. * Range - Each 50m range takes an additional 1 second to aim. Pistols incur -1 Attack per 50m. Rifles incur -1 Attack per 100m. * Aiming with a Scope - Using a scope triples the aim time and the effective range."))) "Example of Play" (chapter :name "Example of Play" :sectionmap (sectionmap "Street Fight" (section :name "Street Fight"))) :Rules (chapter :name "Rules" :sectionmap (sectionmap "Weapon Rules" (section :name "Weapon Rules" :rulemap (rulemap "Firing Arc" (rule :name "Firing Arc" :summary "Larger weapons are often cumbersome to use or aim and may only attack in a particular arc. The following abbreviations are used: * F - Front. Can only attach in any front arc. * B - Back. Can only attack in any rear arc. * FF - Fixed Forward. Can only attack the forward arc. * FB - Fixed Backward. Can only attack the rear arc. * FL - Fixed Left. Can only attack the left arc. * FR - Fixed Right. Can only attack the right arc. * Turrent - Turret mount. Can attack in any direction but must use [Turret] rules to fire anywhere but forward. * Pintle - Pintle mount. Can attack in any direction without limit, but if the pintle mount is used, a crew member is exposed and may be targetted separately from the vehicle at -1.") :Reload (rule :name "Reload" :summary "* [Action]: An item with Reload may not be used until all Reload tokens are removed. * [Action]: An item with Reload adds the number of Reload tokens each time the item is used. * Gain a White [Reload] Token for each Reload value each time the weapon is fired. 1. Panther G 13 sec 2. PZ IV F1 9 sec 3. PZ IV F2 10 sec 4. Tiger 1E 15 sec 5. IS-2 20 sec - This is longer due to the IS-2 having a 122mm cannon and the shell has to be loaded in two parts. Although the first shot to a Panther, Tiger or a PZ IV is usally fatal. 6. KV-1S 12 sec 7. T34-76 13 sec") "Shoot From The Hip" (rule :name "Shoot From The Hip" :summary "* Any unit shooting from the hip takes -1 Attack."))))) :Skills (chapter :name "Skills" :sectionmap (sectionmap "Combat Skills" (section :name "Combat Skills" :skillmap (skillmap :Defend (skill :name "Defend" :titles "Armorer, Defender, Shield Bearer, Shield Warden, Warder" :stat "Body" :abilitymap (abilitymap :Armorsmithing (ability :name "Armorsmithing" :summary "* The ability to repair, improve, or even create armor.") :Counterattack (ability :name "Counterattack") "High Block" (ability :name "High Block" :summary "-1 Speed +4 Defense vs. [High Attack] +1 Defense vs. other attacks") "Low Block" (ability :name "Low Block" :summary "-1 Speed +4 Defense vs. [Low Attack] +1 Defense vs. other attacks") "Powered Armor" (ability :name "Powered Armor") "Shield Bash" (ability :name "Shield Bash") "Shield Block" (ability :name "Shield Block" :summary "* [Defend] [Damage]: Add Shield [Armor] to your [Armor].") "Shield Charge" (ability :name "Shield Charge") "Shield Guard" (ability :name "Shield Guard" :summary "* [Reaction] [Damage]: Before adjacent unit takes damage, discard a [Club] to add your Shield [Armor].") "Shield Sacrifice" (ability :name "Shield Sacrifice" :summary "* [Club] [Defend] [Damage]: The shield becomes the target of any [Overwhelm] damage.")) :specialtymap (specialtymap "Medium Armor" (specialty :name "Medium Armor") "Heavy Armor" (specialty :name "Heavy Armor") :Shields (specialty :name "Shields"))) "Close Combat" (skill :name "Close Combat" :reference "* The usefulness of kicks in self-defense and actual combat has been debated. Kicks are powerful but risk balance, expose the groin, and risk take downs. * Joker, there is nothing wrong with you that I can't fix. With my hands. - Batman, The Dark Knight Returns * There are seven working defenses from this position. Three of them disarm with minimal contact, three of them kill. The other....hurts. - Batman, The Dark Knight Returns * Beat losers, get paid. - Sett, Runeterra" :summary "* [Targeting]: Close combat may only be used to attack the space directly ahead or the space you are on. * The baseline for kicking abilities is that they are -1 Speed and +1 Damage with a minor special ability. NAME SPD DMG MV DEF SHORT KICK + 1 + 0 + 0 S,C,A FORWARD KICK + 0 + 2 -- 1 S,C,A ---------------------------------------------------------------------------------------------------------------------------------- BACK ROUNDHOUSE -- 2 + 2 -- 1 None K2 * Ignores all Blocks except for San He and Evade Blow. *CARTWHEEL KICK -- 1 -- 1 + 0 S,C (2 W) K4, A3 * DMG vs. all adjacent hexes; opponents who take DMG are Knocked Back one hex; Straight Line attack; the fighter may use full MV, dealing DMG each time he moves next to an opponent. CRESCENT KICK -- 1 + 4 -- 2 S, miss C K3 * KDA DESCENDING WHEEL KICK -- 2 +3 (x2) + 0 (Special) (1 W) K4, A3, Jump, Ft.Swp * First hit = Aerial, Block- S, miss C; Second hit = Crouching, KD, Block- C, miss A. FOOT SWEEP -- 2 + 3 -- 2 C, miss A K2, Crouch * KD; Crouching Maneuver. FORWARD CHEST KICK + 0 + 2 -- 1 S,C,A K3 * KD. Forward Flip Kick + 1 + 5 Two S,A (1 W) K3, A3, Handstand Kick * KD, KDA (unless blocking), (dodge move?) *FORWARD SLIDE KICK + 0 + 2 + 0 C, miss A K2, A2 * KD FRONT SNAP KICK + 2 + 2 None S,C,A K2 ** HAMMER KICK -- 2 + 3, + 4 -- 2 C,miss A (1 W) K3,(x2)K,Ft.Swp * KD; Hits Downed opponents. *HEEL STAMP + 2 -- 4 + 1 S,C, miss A K1, A1 * Opponent is Knocked Back (Fighter's Str. + Athletics) - Opponent's Str.; Fighter is KnockedBack 1. JUMPING SOBAT(TO) -- 1 + 4 Two S,C,A K2, A1, Jump * Aerial. (MY: Aviods Sweeps [fist,foot,spin foot], may only be blocked C or w/ Kick Def) This is charlie's hop toward low kick. KNEE DROP -- 1 + 3 -- 1 (miss S,C,A) K2, A1 * Attacks Downed opponents only. LONG SWEEP KICK -- 2 + 3 None C, miss A K2, Crouch, Foot Sweep * KD; Crouching; this maneuver may be used to strike an opponent who is 1 Hex away. PUSH KICK (STOMACH KICK) + 0 + 1 + 0 S,C,A K2 * Knockback. RISING BIRD KICK -- 1 + 0(x3) One S,C (1 W) K4,A4,Jump,Dbl-Hit Kick * KDA; Aerial Maneuver. Shin Strikes (+ 0) (+ 1) (+ 0) (Normal) K3 * used in conjunction with any basic Kick; the fighter must be in an adjacent Hex to use this maneuver. SPINNING FOOT SWEEP -- 2 + 3(x2) None C, miss A (1 W) K2, A1, Foot Sweep * DMG is dealt to all adjacent hexes, target in front of fighter is struck twice; KD; Crouching. SPLITS KICK -- 1 + 4 One S, miss C K2 * KDA STEPPING FRONT KICK + 0 + 1(x2) + 1 S,C (1 W) K4, Double-Hit Kick * Fighter must MV into opponent's hex; 1st hit causes Knockback. Studder Step Kick + 1 + 2 One C(miss A) K3, A1 * Must be blocked low. THRUSTING FORWARD KICK + 1 + 2 + 1 S, C (1 W) K2, A1 * Aerial Maneuver; KDA. Punch Name Speed Damage Move Defense Jab +2 -1 +0 S,C,A Strong Punch +0 +1 +0 S,C,A Fierce Punch -1 +3 -1 S,C,A ---------------------------------------------------------------- Boshi-Ken(Thumb Drive)-1 +2 +0 S,C,A P2,A2 xIf damage is scored opponent suffers -1 move next round. Buffalo Punch -2 +5 One S,A P2 Bushin Air Elbow +2 -1 +2 S,A P3,A1,Elbow Strikes,Jump xAerial Maneuver Caber Punch -2 +3 -1 S,C,A P2,Str4 xKD Cobra Hand Strike +3 +1 +1 S,C,A (1W) P3 Dash Punch +0 +4 +2 S,C (1W) P4,A1 Dash Uppercut +0 +4 +2 S,miss C (1W) P4,A1,Dash Punch xKDA Double Hit Punch -1 +0(x2) +0 S,C,A P2 Ear Pop -1 +0 -1 S,C,A P2 xIgnores Sta:fighter -1 Honor Elbow Barrage +0 +0(x3) One S,C (1W) P4,Elbow Smash,Elbow Strikes xMust be in opponent's hex Elbow Drop +0 +2 +0 miss S,C,A P2,A1 xMust be used on Downed opponent; If opponent is interrupted he loses action and is still considered downed at the end of round. Elbow Smash +2 +2 One S,C,A P1 Elbow Strikes (+0) (+1) (+0) (normal) P3 xUsed in conjunction with any basic punch, must be in opponent's hex. Fist Sweep -1 +3 -2 C,miss A P3 xCrouching Maneuver;KD Flaming Dragon Punch-1 +6(x3) -2 S,C (1C,1W) P5,A1,F2,Dragon Punch xKD;Knockback 1(all);->Aerial Maneuver Hand Of The Crane +1 +0 +0 (Normal) P4 xMay be used in conjunction with any basic Punch while standing. Hand Of The Eagle Claw+1 +0 +1 (Normal) P4,A3,Jump xMay be in conjunction with any basic Punch while Aerial. Hand Of The Striking Mantis+0 +0 +0 (Normal) P4,A2,Dex4 xMay be used in conjunction with any basic Punch while standing: fighter may strike opponent one hex away. Hook +0 +3 -2 S,C,A P1 Iron Palm(Tieh Sha Chang) +0 +4 -1 None (1C) P4,F4 xIgnores Blocks;KDA Kidney Punch +0 +2 +0 S,C,A P2 xFighter must be behind opponent or in opponent's hex to execute this maneuver; following round opponent is -1 SPD. Lunge Punch +0 +1 +1 C P3,A1 Neck Shatterer -1 +4 -2 S,miss A P2,Elbow Strikes Palm Heel Punch -2 +3 +0 S,C,A P2 xWhen DMG is dealt treat total as if it were one higher for purposes of calculating dizzy. Power Uppercut -1 +3 One S,C P1 xKDA Razor Fist Punch +1 +4 +0 S,C (1C,1W) P5 xKnockback1;DMG is Aggrivated Rekka Ken (+3) (+0) (+0) (Normal) (1W per turn)P4,A2 xUsed with any basic punch; can be used for up to 3 turns; if used full 3 turns next round must be spent taunting, or lose 3 Glory; Combo to dizzy. Reverse Fist Punch +0(+2) +2 One S,C,A P1 x+2 SPD if punch follows a set up punch. Rushing Strong +0 +1 +1 S,A P2 Shikan Ken(knuckle fist) +1 +1 +0 S,C P2 xSTR.test to knock opponent back 1 hex; KDA Shockwave +0 +0 None S,C,miss A (1C) P4,F2 xShockwave extends in straight hex line; 1 hex per dot in STR; KD all. Spinning Chothesline +0 +0 -2 S,miss C (1W) P4,A3,Clothesline xDMG vs. all adjacent hexes; Knockback 1 each time DMG is dealt; Advance with MV after each hit, may roll DMG again if applicable; Dodge Maneuver. Spinning Knuckle -1 +1(x2) +3 S,C (1W) P3,A1,Spinning Back Fist xDodge Maneuver. Strong Decending Elvow +0 +1 +1 S,A P2,A1,Jump xAerial. Sword Hand Strike -1 +4 -2 S,C,A P3 xIgnores armor,Toughskin,etc. Triple Strike -2 (+0,+0,+1) None S,C,A P2,K1 xRoll three damage tests as indicated, take highest two rolls. Turn Punch Rnd 1-1 +4 Two S,C (W first turn)P4 Rnd 2-1 +5 Two S,C Rnd 3+0 +6 Two S,C Rnd 4+1 +7 Two S,C xCard is layed face down; May be played at any time thereafter as long as card is left face down; -1 SPD,DMG,MV while charging maneuver; Need not be used. Uppercut +1 +2 -1 S,C,A P1 x +1DMG vs. Crouching." :titles "Brawler, Grappler, Hand-to-Hand, Infighter, Martial Artist, Wrestler" :stat "Body" :abilitymap (abilitymap :Punch (ability :name "Punch") :Kick (ability :name "Kick" :summary "* [Low Attack] -1 Initiative -1 Move +1 Damage") :Grab (ability :name "Grab" :summary "-1 Initiative -1 Action * Attempt to grab an item. Roll vs. Body to succeed.") "Back Fist" (ability :name "Back Fist" :summary "* Strike with the back of the fist or open hand." :titles "Backhand, Bitch Slap") :Clothesline (ability :name "Clothesline" :summary "Clothesline -1 +2 +0 S,C,miss A") "Bull Rush" (ability :name "Bull Rush") :Charge (ability :name "Charge") "Crouching Strike" (ability :name "Crouching Strike" :summary "Crouch low and deliver a powerful blow to the mid-section or below the belt. * [Attack] [5]: +1 Effect" :titles "Ducking Punch") "Deflecting Punch" (ability :name "Deflecting Punch" :summary "* The fighter deflects a punch at him and immediately counters with a punch of his own. * [Counter]: +1 Effect") "Dragon Strike" (ability :name "Dragon Strike" :summary "* When striking with the fist, more power can be exerted when the movement originates from the feet, is guided by the waist, flows through the body, and exits through the fist. * [Attack] [J]: +1 Knockback * [Aerial]" :titles "Dragon Fist, Dragon Punch") "Ear Pop" (ability :name "Ear Pop" :summary "* Disorienting attack that causes temporary or permanent deafness. * -1 Initiative * -1 Attack * +2 Stun * -2 Move * Criticals: Deafness") "Elbow Drop" (ability :name "Elbow Drop") "Elbow Strike" (ability :name "Elbow Strike" :summary "* Devastating blow common to Muay Thai. * +1 Initiative * +1 Damage * 1 Move" :titles "Elbow Smash") "Eye Rake" (ability :name "Eye Rake" :summary "* Disorienting attack that causes temporary or permanent blindness. * -1 Initiative * -1 Attack * +2 Stun * -2 Move * Criticals: Blindness") "Fists of Fire" (ability :name "Fists of Fire") :Haymaker (ability :name "Haymaker" :summary "* A slow all out attack that causes massive damage. Especially useful to finish off weakened opponents. -2 Initiative 0 Move +2 Damage" :titles "Two-Fisted Smash") "Head Butt" (ability :name "Head Butt" :summary "-2 Move +1 Damage") :Hyperfist (ability :name "Hyperfist" :summary "* [Critical Hits] can be exchanged for additional Attacks. Same as [Auto]. -2 Initiative -1 Damage 1 Move" :titles "Hundred Hand Slap, Lightning Fist, Rapid Punch") :Jab (ability :name "Jab" :summary "* A quick, weak strike. +2 Initiative +1 Accuracy -2 Damage +1 Move") "Knife Hand" (ability :name "Knife Hand" :summary "* [Damage]: [Critical Hits] may reduce opponent's [Armor] roll.") "Knuckle Fist" (ability :name "Knuckle Fist" :summary "* [Critical Hits] cause Knockback.") "Monkey Punch" (ability :name "Monkey Punch" :summary "* Grab blocking arm and punch * If opponent used a block, ignore it." :titles "Grab Punch") "Nerve Strike" (ability :name "Nerve Strike" :summary "* Use the tips of the fingers to strike and pinch nerve clusters to produce pain and debilitation. * [Action] * -1 Initiative * +1 Stun" :titles "Atemi Strike, Atemi Waza, Cobra Strike") "One Two Punch" (ability :name "One Two Punch") "Palm Strike" (ability :name "Palm Strike" :titles "Palm Heel Strike, Shotei") "Phoenix Strike" (ability :name "Phoenix Strike" :summary "* Middle finger protrudes from fist to strike nerve clusters to cause numbness. * [Criticals] can be exchanged for Slow tokens.") :Ram (ability :name "Ram" :summary "* [Action] * +1 Knockback" :titles "Shoulder Smash") "Spinning Back Fist" (ability :name "Spinning Back Fist" :summary "* The fighter spins around adding force to the blow. -1 Initiative +1 Damage +1 Move") "Strike Defense" (ability :name "Strike Defense" :summary "* The fighter concentrates on the strikes of the opponent but becomes vulnerable to other attacks. * [Reaction] +1 Initiative -1 Move +2 Defense vs. Strikes (-1 Defense vs. Others)") "Sword Hand" (ability :name "Sword Hand" :summary "+1 Accuracy +1 Damage -2 Move" :titles "Karate Chop") "Tiger Claw" (ability :name "Tiger Claw" :summary "Tiger Claw Strike (+0) (+1) (+0) S,C,A") :Uppercut (ability :name "Uppercut" :summary "* This powerful punch starts low and ends high using the fighter's leg and back muscles to increase damage. * [Criticals] can be exchanged for Knockback -1 Initiative +1 Damage -1 Move") "Axe Kick" (ability :name "Axe Kick" :summary "* Fighter raises his leg high over his head and snaps it down toward the opponent's head and neck. * [High Attack] -1 Initiative -2 Move +1 Damage") "Back Kick" (ability :name "Back Kick") "Backflip Kick" (ability :name "Backflip Kick" :summary "* [High Attack] * [Limited] by [Acrobatics]. +1 Initiative 1 Move (directly backwards) +1 Damage" :titles "Flash Kick") "Crescent Kick" (ability :name "Crescent Kick") "Double Kick" (ability :name "Double Kick" :summary "* [Combo]: [Roundhouse Kick] followed by [Spinning Thrust Kick]") "Dragon Kick" (ability :name "Dragon Kick" :summary "-- 1 +6 (x2) -- 2 S,C (1C, 1W) K5, F4, Jump * Knockback; KD; -->Aerial Maneuver.") "Dragon Tail" (ability :name "Dragon Tail" :summary "* The fighter drops low, extends his leg and whirls around quickly, kicking his opponents and knocking their feet out from under them. -2 Initiative -1 Accuracy Damage is [Knockback] instead. Criticals are [Knockdown] instead." :titles "Iron Broom, Tiger Tail Sweep") "Drop Kick" (ability :name "Drop Kick" :summary "* Ends [Prone]. * Kick the opponent with the soles of both feet and fall to the ground. -- 1 + 2 -- 1 S miss C,A K2, A1 **") "Flying Kick" (ability :name "Flying Kick" :image "MartialArts/FlyingKick.jpg" :summary "* The fighter launches himself feet first into the air toward his opponent. He ends his move with a powerful kick, usually to the opponent's head or midsection. +1 Accurary +1 Damage +1 Move (Aerial in one direction) + 0 + 6 -- 2 S,C (1 W) K4, A4, Jump * Knockback; KD; --> Aerial Maneuver." :titles "Flying Thrust Kick") "Foot Stomp" (ability :name "Foot Stomp" :reference "* The toe crusher. That went out of style when I left kindergarten. - Kung Fu Hustle" :summary "* Stomp on opponent's foot to slow their movement.") "Handstand Kick" (ability :name "Handstand Kick" :summary "* The fighter bends over, places his hands on the ground, and then presses his legs up into a handstand. The legs snap up with tremendous kicking force. Can be used while [Prone] -1 Initiative 1 Move +2 Damage") "Hurricane Kick" (ability :name "Hurricane Kick" :image "MartialArts/HurricaneKick.jpg" :summary "-1 Speed -2 Attack * May attack up to 2 units in any surrounding spaces." :titles "Butterfly Kick, Whirlwind Kick") "Kick Defense" (ability :name "Kick Defense" :summary "* The fighter concentrates on the legs of the opponent but becomes vulnerable to other attacks. * [Reaction] +1 Initiative -1 Move +2 Defense vs. Kicks (-1 Defense vs. Others)") "Kick Off" (ability :name "Kick Off" :summary "* Propel yourself and opponent apart instead of damaging. Especially useful when the opponent is near dangerous terrain. -1 Initiative +1 Accuracy [Hits] are [Knockback] instead. [Critical Hits] are [Knockdown] instead." :titles "Heel Stamp") "Knee Drop" (ability :name "Knee Drop") "Knee Strike" (ability :name "Knee Strike" :image "MartialArts/TigerKnee.jpg" :summary "* Leap up to strike with the knee to the stomach, chest or face using the momentum of the leap to increase damage. +2 Initiative +1 Damage 0 Move" :titles "Flying Knee Thrust, Tiger Knee") "Leg Sweep" (ability :name "Leg Sweep" :summary "* A low spinning kick designed primarily to knock an opponent of his feet. -2 Move -1 Accuracy [Low Attack] +1 Damage [Critical Hits] are [Knockdown]" :titles "Foot Sweep") "Lightning Leg" (ability :name "Lightning Leg" :image "MartialArts/LightningLeg.jpg" :summary "* [Finishing Move] * [Attack]: [Auto] LIGHTNING LEG -- 2 + 1(x3) None as 100handslap (1 W) K3, Double Hit Kick * Knockback; When this maneuver is chosen the fighter determines which of the three attacks strike high, and which strike low (2 high, 1 low; or 1 high, 2 low), this affects blocking accordingly.") "Reverse Front Kick" (ability :name "Reverse Front Kick" :summary "* Feint kick past head then snap back into the back of the head or neck. -1 Initiative +1 Accuracy -2 Move") "Roundhouse Kick" (ability :name "Roundhouse Kick" :summary "* Fighter pivots and kicks using the momentum from the pivot to increase the damage of the kick. -1 Initiative -1 Action +2 Damage") "Scissor Kick" (ability :name "Scissor Kick" :summary "* Leap up and kick two opponents in different directions simultaneously. -1 Initiative 0 Move [Aerial] -1 Damage") "Side Kick" (ability :name "Side Kick") "Slide Kick" (ability :name "Slide Kick" :summary "+1 Speed * [Low Attack] * Critical Hits can be [Knockdown] * End Action [Prone]") "Spinning Thrust Kick" (ability :name "Spinning Thrust Kick" :summary "* Fighter spins gaining momentum and thrusts with the heel. -2 Initiative -2 Move +2 Damage" :titles "Amaranth Kick, Mule Kick") "Vault Kick" (ability :name "Vault Kick" :summary "* Vault over an obstacle and land a devastating kick with all of your weight. +0 Move - Ignore the terrain penalty of 1 space next to the target. +0 Accuracy - [High Attack] +1 Damage Criticals are [Knockback]") "Atomic Drop" (ability :name "Atomic Drop") "Air Throw" (ability :name "Air Throw" :summary "* The fighter intercepts a leaping or flying opponent in mid-air, twists, and slams him to the ground, landing on top of him. * [Reaction], [Aerial] +1 Initiative +0 Damage is [Knockdown]. Damage also reduces falling Damage to the fighter. Criticals are [Knockdown]. Criticals also reduces falling Criticals to the fighter.") :Backbreaker (ability :name "Backbreaker" :summary "* The fighter lifts his opponent in the air and smashes him to the ground or onto his knee. This maneuver can cause serious spinal injuries. * Uses a [Hold] -2 Initiative -1 Accuracy +2 Damage Criticals are [Cripple]") "Backroll Throw" (ability :name "Backroll Throw" :summary "* The fighter grabs the opponent and then rolls backwards while using his legs to help lift and throw the opponent over him. The opponent is send directly behind the fighter and the fighter is left [Prone]. * Uses a [Hold] -1 Initiative +1 Damage is [Knockdown] Criticals are [Knockdown]") "Bear Hug" (ability :name "Bear Hug" :summary "* The fighter wraps his arms around the opponent and crushes him. * [Continuous] * Requires a [Hold] -1 Initiative +1 Damage 1 Move") "Choke Hold" (ability :name "Choke Hold" :summary "* The fighter wraps his arms around the opponents neck and begins choking him. * [Continuous] * Requires a [Hold] -1 Initiative Criticals are [Asphixiation] 1 Move") "Fighting Hold" (ability :name "Fighting Hold" :summary "* While holding the opponent, strike him repeatedly. * Requires [Hold] * [Continuous] +1 Initiative +1 Accuracy +1 Damage 1 Move") "Grappling Defense" (ability :name "Grappling Defense" :summary "* Skilled grapplers must learn how to resist and escape from the same maneuvers that they use. * [Reaction] +1 Initiative -1 Move 0 Damage - Remove a [Hold] from yourself. Criticals - Remove additional [Holds].") "Ground Fighting" (ability :name "Ground Fighting" :summary "* [Passive]: Ignore penalties for being [Prone].") :Headlock (ability :name "Headlock") "Hip Throw" (ability :name "Hip Throw" :summary "* This is a quick move to get an opponent on the ground. The fighter moves a leg behind the opponent's and pushes him past the hip and directly to the floor. -1 Move Damage - [Knockdown] Criticals - [Knockdown]") :Hold (ability :name "Hold" :summary "* Puts a [Hold] on opponent. +1 Initiative 0 Damage - Add a [Hold] token. 0 Criticals") :Hook (ability :name "Hook" :summary "* The hook is a powerful punch with knockout power. * When throwing a hook, the puncher shifts his body weight to the lead foot, allowing him to pivot his lead foot and generate kinetic energy through the hip/torso/shoulder, swinging his lead fist horizontally toward the opponent. -1 Initiative +1 Damage +0 Criticals - [Stun]") "Iron Claw" (ability :name "Iron Claw" :summary "Damaging Grab") "Joint Lock" (ability :name "Joint Lock" :summary "* The fighter grabs a limb tightly and leverages the limb in ways the joint was not meant to turn. The attack is incredibly painful and can cause sprains, dislocations, and breaks. * [Continuous Hold] -2 Initiative -1 Accuracy +0 Damage - +1 Stun +0 Criticals - [Cripples]" :titles "Armbar, Armlock, Hammerlock, Leg Lock") "Knee Bash" (ability :name "Knee Bash" :summary "* While holding the opponent, knee him repeatedly in the head or stomach. * Requires [Hold] * [Continuous] -1 Initiative +1 Accuracy +2 Damage 0 Move") "Neck Break" (ability :name "Neck Break" :summary "* The fighter grabs the opponent's head and twists it with the intention to break the neck. For best effect this is used as a surprise attack. -2 Initiative -2 Accuracy +4 Damage Criticals are [Cripples]") :Nelson (ability :name "Nelson") :Piledriver (ability :name "Piledriver") :Pin (ability :name "Pin" :summary "* While grappling, attempt to immobilize the opponent. * Requires [Grapple] * [Continuous] +1 Damage - Damage is [Stun]. Criticals are [Slow]") :Reversal (ability :name "Reversal") "Shoulder Throw" (ability :name "Shoulder Throw" :summary "* The fighter lifts the opponent his is holding over a shoulder and hurls him as far as his strength will allow. * Requires a [Hold]. -1 Move +1 Damage - [Knockback] in any direction the fighter chooses. Criticals - [Knockback]") "Sleeper Hold" (ability :name "Sleeper Hold") :Suplex (ability :name "Suplex") :Tackle (ability :name "Tackle" :summary "* Dive at the opponent and use weight and momentum to take you both to the ground. +1 Initiative +1 Move +1 Accuracy. Succeed or fail, the fighter is [Prone]. Damage is [Knockdown]. Criticals are [Knockdown]" :titles "Flying Tackle") "Take Down" (ability :name "Take Down" :summary "* Fighter wraps his limbs around the opponent and causes both fighters to fall [Prone]. +1 Initiative -1 Move 0 Damage - Both fighters are [Prone] and puts a [Hold] on the other. 0 Criticals") "Thigh Press" (ability :name "Thigh Press")) :specialtymap (specialtymap :Strikes (specialty :name "Strikes") :Kicks (specialty :name "Kicks") :Grappling (specialty :name "Grappling" :summary "* Atomic Drop * Air Throw * Backbreaker * Backroll Throw * Bear Hug * Choke Hold * Fighting Hold * Grappling Defense * Ground Fighting * Headlock * Hip Throw * Hold * Hook Hold * Iron Claw * Joint Lock * Knee Bash * Neck Break * Nelson * Piledriver * Pin * Reversal * Shoulder Throw * Sleeper Hold * Suplex * Tackle * Take Down * Thigh Press") :Aikido (specialty :name "Aikido" :reference "* Water flows and takes any shape or course, yet it is always consistant with its own nature." :summary "* This essentially noncombative Japanese art concentrates on the development of the self, and physical, mental, and spiritual nonresistance. By moving with and blending with an opponent's attacks, they may be used against him. * Athletics - [Breakfall] * Evasion - [Deflect], [Disengage], [Drunken Monkey Roll], [Evasive Roll], [Iron Horse], [Weapon Block] * Grapples - [Air Throw], [Backroll Throw], [Disengage], [Grab], [Grapple Defense], [Hip Throw], [Joint Lock], [Pin], [Shoulder Throw], [Takedown] * Kicks - [Dragon Tail], [Kick Defense], [Leg Sweep], [Slide Kick] * Strikes - [Nerve Strike], [Strike Defense] GRAB: Ugoku Taosu(5) Atemi Torae(4) FOCUS: Push(2) Chi Kung Healing(3) Ghost Form(5) Stunning Shout(3) Zen No Mind(3)" :titles "Aikijutsu") :Boxing (specialty :name "Boxing" :summary "* Boxing is a fighting style that concentrates exclusively on punches. * Evasion - [Iron Skin] * Strikes - [Dash Attack], [Deflecting Punch], [Feint], [Haymaker], [Head Butt], [Hook], [Hyperfist], [Jab], [Ram], [Spinning Back Fist], [Uppercut] * Grapples - [Grab]") :Brawling (specialty :name "Brawling" :summary "* Brawling is no holds bars, no rules hand to hand fighting." :titles "Bruiser, Pit Fighter, Street Fighter, Thug") :Capoeira (specialty :name "Capoeira" :summary "* A Brazilian marital art developed by slaves who were brought to South America from Africa. The style was disguised as dance to avoid punishment when caught training. The style is still typically practiced to music. The style developed acrobatic maneuvers that could be used while chained. Capoeiristas will sometimes cross the field doing cartwheels. Knife fighting is also sometimes included in the style. * Athletics - [Backflip], [Breakfall], [Cartwheel], [Jump], [Kippup] * Evasion - [Drunken Monkey Roll] * Grapples - [Backroll Throw] * Kicks - [Backflip Kick], [Dragon Tail], [Handstand Kick], [Kick Defense], [Knee Strike], [Leg Sweep], [Spinning Thrust Kick] * Strikes - [Head Butt], [Strike Defense]") "Commando Training" (specialty :name "Commando Training" :summary "* Commando Training is a generic term for the fighting styles taught to armed forces members. It is a practical, sometimes brutal style that borrows from a variety of other styles and combines them into a style that can be taught to recruits quickly. * Evasion - [Disarm], [Kick Defense], [Strike Defense] * Grapples - [Choke Hold], [Grab], [Grapple Defense], [Knee Bash], [Joint Lock], [Pin], [Shoulder Throw], [Tackle] * Kicks - [Knee Strike], [Leg Sweep] * Strikes - [Elbow Strike], [Hook], [Knife Hand], [Spinning Back Fist], [Sword Hand]" :titles "Special Forces Training") :Hapkido (specialty :name "Hapkido" :summary "* This Korean Martial Art borrows many techniques successfully from other styles; it is a combination of the Aidido, Jujutsu, and Karate styles of Japan with the Korean systems of hwang Do and Taekyon (percursor to Tae Kwan Do). It is a style that teaches focus on passivity in opposing force, countering and attacking with circular motions, and the absolute penetration of an opponent's defenses. * A Hapkido practitioner receives a strong attack gently and counters a gentle attack powerfully and a subtle rythym of attacks and counters develops in the combat. This perpetual and fluid rythym, as well as constant mobility, are hallmarks of the style. * Athletics - [Breakfall], [Jump] * Evasion - [Disarm], [Evasive Roll] * Grapples - [Back Roll Throw], [Grappling Defense], [Joint Lock], [Choke Hold], [Pin], [Shoulder Throw], [Takedown] * Strikes - [Deflecting Punch], [Nerve Strike], [Phoenix Strike], [Spinning Back Fist], [Strike Defense] * Kicks - [Axe Kick], [Crescent Kick], [Double Kick], [Flying Kick], [Kick Defense], [Leg Sweep], [Roundhouse Kick], [Spinning Thrust Kick]") :Hsing-I (specialty :name "Hsing-I" :summary "* Hsing-I stylists attempt to use the body's internal energy, ch'i, to perform astounding feats. The first set of block-strike manuevers are based on the five elements (fire, water, earth, metal, and wood). The second is a group of animal based forms (including Dragon, Tiger, Horse, Turtle, Chicken, Snake, and Bear). The typical attack is to block a strike, grab the arm or leg, and strike back with the hand. * Evasion - [Deflect], [Weapon Block] * Brawling - [Haymaker] * Grapples - [Hip Throw], [Joint Lock] * Kicks - [Kick Defense], [Leg Sweep] * Strikes - [Grab Punch], [Nerve Strike], [Phoenix Strike], [Strike Defense]" :titles "Heart and Mind") :Hwarang-Do (specialty :name "Hwarang-Do" :summary "* This style concentrates on punches and a wid variety of weapon techniques. Further masters are said to possess mystical powers including telepathy, clairvoyance, and the ability to sense danger. * A Korean style that is said to have grown out of certain healing techniques, and modern masters are often healers as well. Legend has it that a Buddhist mong developed the style and taught it to the Hwarang who were similar the Korean equivalent of knights: fighters, diplomats, and military leaders who lived by a strict code of honor. * Athletics - [Breakfall], [High Jump], [Kippup], [Long Jump] * Evasion - [Deflect], [Disengage] * Grapples - [Choke Hold], [Grapple Defense], [Joint Lock], [Shoulder Throw] * Kicks - [Backflip Kick], [Kick Defense], [Roundhouse Kick], [Slide Kick] * Strikes - [Dash Attack], [Elbow Strike], [Nerve Strike], [Phoenix Strike], [Strike Defense] * Focus Powers - [Blind Fighting], [Spirit Healing], [Zen No Mind]") "Jeet Kune Do" (specialty :name "Jeet Kune Do" :reference "* Use whatever works." :summary "* A martial art created by the late Bruce Lee. After studying many differenct martial arts, Lee decided that their reliance on a limited group of maneuvers made them ineffective. Instead, he catalogued all of the ways that the human body could be used to attack or defend and then created a simplified and practical fighting style with no patterns or predefined conceptions. * Grapples - [Choke Hold], [Joint Lock], [Hip Throw] * Kicks - [Foot Stomp], [Kick Defense], [Lightning Leg], [Roundhouse Kick] * Strikes - [Elbow Strike], [Feint], [Nerve Strike], [One Two Punch], [Phoenix Strike], [Spinning Back Fist], [Strike Defense] * Focus Powers - [Zen No Mind]" :titles "The Way of the Intercepting Fist") :Jujutsu/Judo (specialty :name "Jujutsu/Judo" :summary "* A Japanese fighting style with roots 1200 years old. * Jujutusu focuses on grapples instead of strikes. The typical maneuver grabs an opponent, forces him to the ground, and finishes him off. * Athletics - [Breakfall], [Kippup] * Evasion - [Disarm], [Disengage], [Iron Horse] * Grapples - [Air Throw], [Backroll Throw], [Choke Hold], [Ground Fighting], [Hip Throw], [Joint Lock], [Pin], [Shoulder Throw], [Takedown] * Kicks - [Dragon Tail], [Leg Sweep] * Strikes - [Disarm], [Nerve Strike]") :Kabaddi (specialty :name "Kabaddi" :summary "* [Head Butt] KICK: Slide Kick(2) BLOCK: San He(3) Energy Reflection(3) GRAB: Head Butt Hold(2) Brain Cracker(1) Dislocate Limb(3) Disengage(1) Air Suplex(1) ATHLETICS: Cannon Drill(5) Flying Body Spear(2) FOCUS: Chi Kung Healing(3) Extendible Limbs(4) Fireball(3) Improved Fireball(5) Regeneration(1) Yoga Flame(3) Yoga Teleport(5) Cobra Charm(2) Ghost Form(5) Flying Fireball(3) Inferno Strike(5) Mind Reading(3) Telepathy(2) Chi Push(5) Levitation(3) Balance(3) Leech(3)") :Kalaripayattu (specialty :name "Kalaripayattu" :summary "* A boxing art from southern India that dates back to 500 AD. Fighters are trained in 4 syltes: unarmed, stick fighting, other weapons, and the 108 vital points of the human body. Masters are also skiled healers. * Athletics - [Breakfall], [Jump] * Grapples - [Joint Lock], [Throw] * Kicks - [Flying Kick], [Roundhouse Kick] * Strikes - [Elbow Strike], [Nerve Strike], [Phoenix Strike], [Strike Defense], [Sword Hand] * Focus Powers - [Spirit Healing]" :titles "Battlefield Practices, Gurus") :Karate (specialty :name "Karate" :summary "* Karate focuses on direct strikes and kicks with few grabs or throws. * An extremely popular martial art originating in Okinawa, Japan in 400 AD. It became well developed only after the Japanese invaders forbade the Okinawans to carry weapons. * Athletics - [Jump], [Kippup] * Close Combat - [Hook] * Evasion - [Deflect], [Disarm], [Iron Horse], [Iron Skin] * Grapples - [Backroll Throw], [Hip Throw], [Shoulder Throw] * Kicks - [Axe Kick], [Back Kick], [Cresent Kick], [Dobule Kick], [Dragon Tail], [Flying Kick], [Foot Stomp], [Kick Defense], [Leg Sweep], [Reverse Front Kick], [Roundhouse Kick], [Scissor Kick] * Strikes - [Crouching Strike], [Dash Attack], [Dragon Fist], [Elbow Strike], [Knife Hand], [Nerve Strike], [Palm Strike], [Spinning Back Fist], [Strike Defense], [Sword Hand], [Tiger Claw]" :titles "Empty Hands") :Kickboxing (specialty :name "Kickboxing" :summary "* [Backroll Throw] * [Dashing Punch] * [Haymaker] * [Hyperfist] * [Knee Bash] * [Slide Kick] * [Spinning Back Fist] PUNCH: Feint(1) Hook(1) Double Hit Punch(1) Heart Punch(4) Lunge Punch(2) Fist Sweep(2) Dashing Punch(5) Turn Punch(5) Rekka Ken(5) Spinning Back Fist(1) Spinning Knuckle(3) KICK: Double Dread Kick(3) Back Roundhouse(1) Ax Kick(3) Reverse Frontal Kick(1) Flying Knee Thrust(1) Stepping Front Kick(3) Slide Kick(2) Double Hit Kick(1) Wounded Knee(2) BLOCK: Deflecting Punch(1) GRAB: Knee Basher(2) Back Roll Throw(1) Brain Cracker(1) ---- Savate ---- PUNCH: Spinning Back Fist(1) Palm Heel Punch(1) Ear Pop(2) Spinning Knuckle(3) KICK: Ax Kick(2) Double Hit Kick(1) Flash Kick(4) Double Dread Kick(3) Foot Sweep(1) Spinning Foot Sweep(1) Lightning Leg(5) Slide Kick(2) Stepping Front Kick(4) Flying Knee Thrust(1) Double Hit Knee(1) BLOCK: GRAB: Knee Basher(2) Bear Hug(1) Neck Choke(2)" :titles "Savate") :Kobujutsu (specialty :name "Kobujutsu" :summary "* The martial art specializing in Okinawan weapons. * Melee - [Bash], [Dazing Blow], [Disarm], [Fleche], [Jab], [Parry], [Riposte], [Slash], [Sweep], [Thrust] * Melee Weapons - [Bo Staff], [Eiku], [Jo Staff], [Kama], [Nunchaku], [Sai], [Tonfa]") :Krabi-Krabong (specialty :name "Krabi-Krabong") "Kung Fu, Crane Style" (specialty :name "Kung Fu, Crane Style" :summary "* The crane was known for its grace and beauty. Known to stand on one leg for long periods of time, it is no wonder that the crane stylists had excellent balance and were known for their awesome kicking ability and long range techniques. * Crane is very upright, attacking with carefully aimed strikes at long range and defending with redirection and retreat rather than resistance. Working from outside an opponent's effective range, Crane demands extreme technical proficiency and smooth footwork, as well as careful timing and judgment. Crane is high, circular, soft, and distant, working chiefly with progressive indirect attacks. * Athletics - [Breakfall], [High Jump], [Jump] * Evasion - [Avoid], [Deflect], [Evasive Roll], [Sidestep] * Kicks - [Axe Kick], [Flying Kick], [Kick Off], [Leg Sweep], [Vault Kick] * Strikes - [Dash Attack], [Grab Punch], [Nerve Strike], [Spinning Back Fist]") "Kung Fu, Dragon Style" (specialty :name "Kung Fu, Dragon Style" :summary "* Shen Lung (Spiritual or Invisible Dragon): While the Dragon is not a formally taught style in Shen Lung it instead represents what emerges when a practitioner can draw freely from all five animals as the situation demands. One who can use the power of Tiger, the mechanics of Mantis, the speed of Snake, the movements of Crane, and the cunning of Monkey. * As the dragon floats through the sky he twists and coils, flipping his tail as he turns. The dragon stylist uses turns and circular motions to throw and strike his opponents. * 'Ride the wind', a phrase which means follow rather than lead. Provide no opening without first letting your opponent open. Unlike Crane, which also relies heavily upon evasion as a tactic, the Dragon evades primarily by rotation of upper or lower torso with little or no stance movements, while the Crane stylist hops frequently to reposition the entire body. Both styles employ pinpoint strikes to vulnerable meridian targets, but dragon also heavily uses tiger-like punches and clawing techniques, snake-like stance shifts, and leopard-like hit and run strikes to weaken a physically superior adversary. Dragon kung fu also regularly employs low sweeping techniques * Kicks - [Dragon Tail], [Flying Kick] * Strikes - [Dragon Fist], [Nerve Strike]") "Kung Fu, Leopard Style" (specialty :name "Kung Fu, Leopard Style" :summary "* The leopard was known for its tremendous speed and cunningness. Unlike the tiger that doesn't mind frontal attacks, the leopard stylist prefers to attack only when the odds are in his favor. The only time he shows he is hurt is when he is not. He acts like he is running away in order to come back with an attack on his own ground. * Blocking is wasted in Leopard - the style can be summed up with 'Why block when you can hit?' It does not rely on rooted stances, and would only assume a stance while in attack in order to launch at the opponent. This hit and run technique of the leopard, something especially effective against larger opponents, is unique to the animal. * An interesting technique of the leopard is the ability to simultaneously block and strike. The sheer speed of the leopard is a defining characteristic of the style * Evasion - [Dodge], [Dodge Roll] * Strikes - [Deflecting Punch], [Dash Attack]") "Kung Fu, Mantis Style" (specialty :name "Kung Fu, Mantis Style" :summary "* Mantis operates in sequences and combinations baffling opponents with multiple simultaneous attacks and blocks, all executed at high speed. Mantis is a quick, high, linear, hard style that attacks by rapidly executed combinations. * [Combo] * Strikes - [Deflecting Punch], [Hyperfist], [Jab], [Knife Hand], [One Two Punch]") "Kung Fu, Monkey Style" (specialty :name "Kung Fu, Monkey Style" :summary "* Monkey style prefers to go to the ground, integrating throws, locks, grappling and ground-fighting. Monkey is very low, both hard and soft, close-range and favors full body contact. * Evasion - [Drunken Monkey Roll] * Grapples - [Grab], [Joint Lock], [Hold], [Pin], [Takedown] * Strikes - [Monkey Punch]") "Kung Fu, Snake Style" (specialty :name "Kung Fu, Snake Style" :summary "* The snake is known for its speed once an opponent is in striking range. The snake raises its head and waits patiently until the unsuspecting opponent gets too close. The snake stylist, too, concentrates on waiting until the time is right and with his fingertips, strikes to a vital spot in a blink of an eye. Knowing how to use one's internal energy or chi is a major part of the snake system. * Snake is a soft style using an opponent's energy against them rather than resisting it. Snakes absorb, control and redirect rather than block an attack. Snake stylists are known for circular and whip-like motions flowing around opponents, climbing over their defenses and striking repeatedly in rapid succession. Snake is high, circular, soft and extremely fast, favoring progressive direct attacks that overwhelm a defense. * Snake style is based on whipping power which travels up the spine to the fingers. The ability to sinuously move, essentially by compressing one's stomach/abdominal muscles, is very important. * Strikes - [Back Fist], [Knife Hand], [Nerve Strike] * Focus Powers - [Death Touch]") "Kung Fu, Tiger Style" (specialty :name "Kung Fu, Tiger Style" :summary "* Known for its power and strength, the tiger stylists were known for their ripping and tearing techniques. Hands held like tiger claws, these fighters would strike and claw with tremendous speed and power. * Tiger emphasizes close-range strikes, throws, and a willingness to stay in the danger zone long enough to set up a single fight-ending blow. Tiger commits fully to every motion, and maximizes power at the expense of mobility. Tiger is low, hard-style, and works with single direct attacks. * Strikes - [Crouching Strike], [Dash Attack], [Dragon Fist], [Elbow Strike], [Eye Rake], [Haymaker], [Strike Defense], [Sword Hand], [Tiger Claw]") "Kung Fu, Wing Chun" (specialty :name "Kung Fu, Wing Chun" :summary "* Wing Chung, literally 'singing spring', is a Southern Chinese kung fu style and a form of self-defense originating in Qing China, which requires quick arm movements and strong legs. Softness (via relaxation) and performance of techniques in a relaxed manner is fundamental to Wing Chun.") "Muay Thai" (specialty :name "Muay Thai" :reference "* Apachai: The use of knees and elbows is very important in Muay Thai. * Akisame: Which, in fact, is rather rare as most contemporary martial arts have banned the use of knees and elbows in tournament fighting. * Kenichi: Really? How come? * Apachai: If you use them wrong, you can kill your opponent! * Akisame: That's right. However, in Muay Thai, they specifically focus on these moves. * Kenichi: Yeahhh, and why is that? * Apachai: Because if you use them right, you can kill your opponent! - Kenichi: World's Mightiest Disciple" :summary "* A fast, brutal martial art from Thailand. * The style uses close strikes with the knees, elbows, fists, and feet. There are no grabs or throws. Fighters often jump up to add more force to their blows. Fighters are also trained to take damage as much as avoid it. * Evasion - [Iron Skin] * Grapples - [Knee Bash] * Kicks - [Axe Kick], [Double Kick], [Foot Stomp], [Kick Defense], [Knee Drop], [Knee Strike], [Leg Sweep], [Lightning Leg], [Reverse Front Kick], [Roundhouse Kick] * Strikes - [Dash Attack], [Dragon Punch], [Elbow Drop], [Elbow Strike], [Feint], [One Two Punch], [Ram], [Spinning Back Fist], [Strike Defense], [Sword Hand], [Uppercut]" :titles "Thai Kickboxing") :Ninjutsu (specialty :name "Ninjutsu" :summary "* Ninjutsu is the art of the Japanese Ninja. Ninjutsu saw greatest use from 1200-1600 AD when warlords employed ninja clans to spy on and assassinate their enemies. * The primary weapons of the ninja are the ninja-to sword and shuriken throwing stars. They were also adept in many types of concealed weapons. They are also known for unusual gadgets to assist them in climbing, crossing water, picking locks, etc. They are assassins, so they are not interested in honorable combat and will use traps or poison instead of combat if possible. * Kunoichi - Female ninja operated as infiltrators, spies and assassins. They spent time in enemy houses, reported secrets and undermined rival houses by any means necessary. Kunoichi could use their gender to their advantage because women were underestimated as warriors. This made it easier for them to get closer to their targets by posing as maids, geisha, servants and priestesses. In some cases, they were taken on as concubines and mistresses, giving them unparalleled access to all their marks. * Athletics - [Backflip], [Breakfall], [Jump], [Wall Spring] * Evasion - [Deflect], [Disarm], [Dirty Fighting], [Disengate], [Distraction], [Dive for Cover], [Dodge], [Dodge Roll], [Weapon Block] * Grapples - [Air Throw], [Backroll Throw], [Choke Hold], [Grapple Defense], [Groundfighting], [Joint Lock], [Suplex], [Takedown], [Tackle] * Kicks - [Backflip Kick], [Handstand Kick], [Leg Sweep], [Roundhouse Kick], [Slide Kick] * Strikes - [Ear Pop], [Grab Punch], [Nerve Strike], [Phoenix Strike] * Melee - [Dazing Blow], [Jab], [Parry], [Riposte], [Slash], [Thrust]" :titles "Shinobi, Kunoichi") :Pakua (specialty :name "Pakua" :summary "* A Chinese 'internal' fighting style derived from I Ching, the Book of Changes which states that the universe is in a state of constant change. Therefore, in Pakua, any change, the placement of the foot, the turning of a hand is important. Pakua is highly circular and emphasizes footwork and constant motion. Pakua masters are said to use palm strikes instead of fist strikes to better control the energy they release. * Evasion - [Deflect], [Sidestep], [Weapon Block] * Grapples - [Grapple Defense], [Joint Lock] * Kicks - [Kick Defense], [Leg Sweep] * Strikes - [Grab Punch], [Palm Strike], [Strike Defense] * Focus Powers - [Zen No Mind]" :titles "Eight Diagrams") :Pentjak-Silat (specialty :name "Pentjak-Silat" :summary "* A broad set of Indonsian fighting styles. Fighters are trained to keep their footing on unstable ground because the condition is so common in Indonesia. Silat teaches many weapons especially the kris, a wavy bladed dagger. The mysticism and legends surrounding this weapon equal or exceed the katana. * Athletics - [Breakfall], [Disarm], [Disengage], [Dodge Roll], [Jump], [Kippup] * Evasion - [Deflect], [Hip Throw], [Iron Horse], [Iron Skin] * Grapples - [Choke Hold], [Grab Punch], [Grapple Defense], [Joint Lock], [Pin], [Takedown] * Kicks - [Double Kick], [Dragon Kick], [Flying Kick], [Leg Sweep], [Lightning Leg], [Roundhouse Kick] * Strikes - [Deflecting Punch], [Hyperfist], [Jab], [Nerve Strike], [Phoenix Strike], [Sword Hand] * Melee - [Fleche], [Parry], [Riposte], [Slash], [Thrust]" :titles "Guru, Pandekar, Silat") :Savate (specialty :name "Savate" :summary "* French Kickboxing developed in Marseilles in the 1600s from kick brawling French sailors. The style is characterized by a bouncing gait and a unique kick style. When delivering kicks, the fighter leans away from the direction of the kick and stretches one arm back like a fencer to maintain balance. This allows the torso to pivot away from any counterattack. Kicks are landed with the toes or shins instead of the ball or heel and are designed to quickly slip by blocking arms. * Evasion - [Disarm] * Grapples - [Back Roll Throw], [Bear Hug], [Choke Hold], [Knee Bash] * Kicks - [Axe Kick], [Double Kick], [Kick Defense], [Kick Off], [Knee Strike], [Leg Sweep], [Lightning Leg], [Roundhouse Kick], [Slide Kick], [Spinning Thrust Kick] * Strikes - [Dash Punch], [Deflecting Punch], [Ear Pop], [Feint], [Hook], [One Two Punch], [Palm Strike], [Spinning Back Fist], [Strike Defense]" :titles "Savateur, Savateuse") :Sumo (specialty :name "Sumo" :summary "* Evasion - [Iron Horse], [Iron Skin] * Grapples - [Air Throw], [Bear Hug], [Grapple Defense], [Knee Bash], [Hip Throw], [Shoulder Throw] * Kicks - [Double Kick], [Dragon Tail], [Leg Sweep] * Strikes - [Ear Pop], [Head Butt], [Hyperfist], [One Two Punch], [Palm Strike], [Sword Hand]" :titles "Cireum") "Tae Kwon Do" (specialty :name "Tae Kwon Do" :summary "* A Korean martial art developed in the 1600s AD. It emphasizes kicks over punches. * Athletics - [Breakfall], [Jump], [Wall Spring] * Evasion - [Deflect], [Iron Horse] * Kicks - [Axe Kick], [Double Kick], [Flying Kick], [Hurricane Kick], [Kick Off], [Knee Strike], [Lightning Leg], [Reverse Front Kick], [Roundhouse Kick], [Scissor Kick] * Strikes - [Deflecting Punch], [Haymaker], [Hyperfist], [Spinning Back Fist], [Sword Hand]" :titles "The Way of Kicking and Punching") "Tai Ch'i Ch'uan" (specialty :name "Tai Ch'i Ch'uan" :summary "* The ultimate internal Chinese martial art. The style is based on the Thirteen Postures (8 actions, 5 directions). It emphasizes blocking a strike and grabbing or striking back. * Athletics - [Balance], [Breakfall] * Evasion - [Deflect], [Disarm], [Disengage], [Iron Horse], [Iron Skin] * Grapples - [Air Throw], [Back Roll Throw], [Grab Punch], [Grappling Defense], [Hip Throw], [Joint Lock], [Pin], [Shoulder Throw] * Kicks - [Dragon Tail], [Kick Defense], [Leg Sweep], [Slide Kick] * Strikes - [Deflecting Punch], [Grab Punch], [Nerve Strike], [Palm Strike], [Phoenix Strike], [Strike Defense] * Focus - [Empty Force], [Spirit Healing], [Zen No Mind]" :titles "Supreme Ultimate Fist, Yin-Yang Boxing") :Wrestling (specialty :name "Wrestling" :summary "* Wrestling is one of the earliest martial arts. Virtually every ancient society had some form of wrestling and many have survived largely unchanged. * Atheltics - [Breakfall], [Jump] * Evasion - [Disengage] * Grapples - [Air Throw], [Backbreaker], [Bear Hug], [Choke Hold], [Grapple Defense], [Hip Throw], [Iron Claw], [Joint Lock], [Knee Bash], [Nelson], [Piledriver], [Pin], [Reversal], [Sleeper Hold] [Shoulder Throw], [Suplex], [Tackle], [Take Down], [Thigh Press] * Kicks - [Knee Strike] * Strikes - [Ear Pop], [Haymaker], [Ram]" :titles "Dumog/Greco Roman/Koshti/Naban/Sanbo/Yaghliguresh") "Wu Shu" (specialty :name "Wu Shu" :summary "* [Axe Kick] * [Backflip Kick] * [Backroll Throw] * [Drunken Monkey Roll] * [Flying Kick] * [Handstand Kick] * [Hurricane Kick] * [Kick Off] * [Kippup] * [Leg Sweep] * [Lightning Leg] * [Reverse Front Kick] * [Rolling Attack] * [Scissor Kick] * [Slide Kick] * [Spinning Back Fist] * [Spinning Thrust Kick] * [Wall Spring] PUNCH: Rekka Ken(5) Spinning Knuckle(3) KICK: Back Flip Kick(2) Forward Back Flip Kick(1) Ax Kick(4) Cartwheel Kick(2) Reverse Frontal Kick(2) Scissor Kick(4) Flying Thrust Kick(4) Forward Flip Knee(2) Handstand Kick(1) Hurricane Kick(1) Air Hurricane Kick(1) Lightning Leg(3) Stepping Front Kick(4) Whirlwind Kick(4) Double Hit Kick(1) Great Wall Of China(5) Descending Wheel Kick(4) BLOCK: Maka Wara(4) San He(3) GRAB: Air Throw(2) Back Roll Throw(1) ATHLETICS: Cannon Drill(5) Displacement(4) Backflip(2) Flying Heel Stomp(3) Rolling Attack(3) Vertical Rolling Attack(3) Wall Spring(1) Evasive Tumble(2) FOCUS: Balance(4) Chi Kung Healing(4) Fireball(4) Improved Fireball(5) Flying Fireball(3)") :Binding (specialty :name "Binding" :summary "* Includes Garotte, Pianowire, Monofilament, Pillowcase, Towel, Rolled up Shirt, etc." :titles "Strangler") :Knives (specialty :name "Knives" :reference "* Do you want to know why I use a knife? Guns are too quick. You can't savor all the little...emotions. You see, in their last moments, people show you who they really are. So, in a way I know your friends better than you ever did. Would you like to know which of them were cowards? - Joker, The Dark Knight" :summary "* Includes Pocket Knives, Switchblades, Straight Razors, Small Kitchen Knives, etc." :titles "Butcher, Knife Fighter, Murderer"))) "Combat Focus" (skill :name "Combat Focus" :titles "Chi Powers" :stat "Spirit" :abilitymap (abilitymap "Blind Fighting" (ability :name "Blind Fighting") :Combo (ability :name "Combo" :summary "* Any combat abilities may be strung together as a Combo. Every ability after the first gets +1 to initiative. If any ability misses or fails, then the combo ends and the next ability is at -1 initiative. Each combo must be chosen when this ability is gained and must be taken again for each separate combo.") "Death Touch" (ability :name "Death Touch" :reference "Five Point Palm Exploding Heart Technique - Kill Bill" :summary "* The fighter strikes vulnerable pressure points, disrupting the opponent's chi flow causing intense pain or death. The effect has no outward effect, but the victim will know something is wrong. Eventually, the victim recovers or dies suddenly from the stress. -1 Action -2 Initiative -2 Accuracy +0 Damage - [Stun] only +3 Criticals - [Poison] 0 Move -1 Defense" :titles "Dim Mak") "Empty Force" (ability :name "Empty Force" :summary "* The fighter projects a strike across empty space. The fighter may strike at any range, but if he does not score at least 1 Criticals for each space of Range, the ability fails. -2 Initiative -2 Move -1 Damage Critical - [Range]" :titles "Distant Death, Kongjin") "Feather Walk" (ability :name "Feather Walk" :summary "* Reduces body weight while active. This increases the effects of [Retreat] and leaping while decreasing falling speed and damage. * If [Skill] greater than or equal to [Body], then unit may walk on any substance that would suspend a feather." :titles "Feather Fall, Walk on Water") "Feign Death" (ability :name "Feign Death") "Hold Breath" (ability :name "Hold Breath") "Spirit Healing" (ability :name "Spirit Healing" :titles "Chi Kung Healing") "Team Combo" (ability :name "Team Combo" :reference "Fastball Special - Colossus and Wolverine, X-men" :summary "* Like a [Combo], the Team Combo chains attacks together. The Team Combo however is performed by different members of a team with the identical Team Combo. Any team member may perform each step of the combo with each subsequent attack allowed to reroll 1 die. The combo ends if any attack misses, any member attacks twice in a row, or if a turn passes with no attack attempt. Any combat abilities may be strung together as a Team Combo (even abilities that only others in the team possess). Each combo must be chosen when this ability is gained and must be taken again for each separate combo.") "Walk on Fire" (ability :name "Walk on Fire") "Zen No Mind" (ability :name "Zen No Mind" :reference "The mind must always be in the state of 'flowing,' for when it stops anywhere that means the flow is interrupted...In the case of the swordsman, it means death. When the swordsman stands against his opponent, he is not to think of the opponent, nor of himself, nor of his enemy's sword movements. ... When he strikes, it is not the man but the sword in the hand of the man's subconscious that strikes. - Zen Master Takuan Soho" :summary "* A mind not fixed or occupied by thought or emotion and thus open to everything. * Mushin is achieved when a fighter feels no anger, fear or ego during combat, so the fighter is totally free to act and react towards an opponent without hesitation. At this point, a person relies not on what they think should be the next move, but what is felt intuitively. * A martial artist would likely have to train for many years to be capable of mushin. This allows time for combinations of movements and exchanges of techniques to be practiced repetitively many thousands of times, until they can be performed spontaneously, without conscious thought." :titles "Mushin"))) :Evasion (skill :name "Evasion" :summary "* Evasion is a special defense typically used by those that choose to wear light or no Armor." :stat "Defense" :abilitymap (abilitymap "Blade Locking" (ability :name "Blade Locking" :summary "* [Requires]: [Parry], May only be used against swords, knives or polearms. * [Reaction]: -2 * [Success]: Opponent gains a [Broken Defense Token] for each [Hit]") :Block (ability :name "Block" :summary "* [Requires]: Can only be used vs Melee or Close Combat toward the left front or right front. May be used with or without a weapon. * [Reaction]: +1 Defense.") :Deflect (ability :name "Deflect" :summary "* Deflect, catch, or even return projectiles hurled at the fighter. * This ability provides a second Defense roll against a projectile attack before the regular Defense roll. * [Reaction] +2 Initiative +1 Accuracy 0 Damage - Any successes become -Damage to the projectile. If the projectile has 0 Damage remaining, it is caught. Criticals - Any Criticals become -2 Damage to the proejctile. If the projectile has 0 Damage remaining and there are still Criticals, the projectile may be immediately thrown at +[Criticals] Accuracy.") "Dirty Fighting" (ability :name "Dirty Fighting" :titles "Bite, Eye Gouge, Ear Pop, Hair Pulling, Low Blow") :Disarm (ability :name "Disarm" :reference "The Red Leaves Cut means knocking down the enemy's long sword. The spirit should be getting control of his sword. When the enemy is in a long sword attitude in front of you and intent on cutting, hitting and parrying, you strongly hit the enemy's sword with the Fire and Stones Cut... If you then beat down the point of his sword with a sticky feeling, he will necessarily drop the sword. If you practise this cut it becomes easy to make the enemy drop his sword. - Miyamoto Mushashi, The Book of Five Rings" :summary "* Strike to knock a weapon or item from opponent's grasp. * This special ability does no damage but allows the user to force a target to drop an item (usually a weapon). -1 Initiative -1 Accuracy 0 Damage. Opponent drops the chosen item. Each critical moves the item 1 space away (your choice)." :titles "Red Leaves Cut") :Disengage (ability :name "Disengage" :summary "* The fighter removes a [Hold] token. * [Reaction] +1 Initiative 0 Damage -1 Move") "Dive for Cover" (ability :name "Dive for Cover") :Dodge (ability :name "Dodge" :summary "+1 Initiative -1 Action +1 Defense") "Dodge Roll" (ability :name "Dodge Roll") "Drunken Monkey Roll" (ability :name "Drunken Monkey Roll" :summary "* [Crouching] -1 Action +2 Initiative +2 Move +1 Defense") "Iron Horse" (ability :name "Iron Horse" :reference "The Blob, X-men" :summary "* The ability to prevent being moved. * [Passive] +1 Initiative Defense - When rolling Defense, [Hits] or [Criticals] can be exchanged for [Knockback] or [Knockdown] resistance. 0 Move" :titles "San He") "Iron Skin" (ability :name "Iron Skin" :summary "* Hardening of the skin to prevent cuts and punctures." :titles "Maka Wara, Stone Skin") :Sidestep (ability :name "Sidestep")) :specialtymap (specialtymap "Light Armor" (specialty :name "Light Armor") :Bucklers (specialty :name "Bucklers"))) :Melee (skill :name "Melee" :reference "* Mizu: I must become the greatest swordsman alive. Swordfather: Is that all? - Mizu and Swordfather, Blue Eye Samurai" :summary "* [Targetting]: Melee combat may only be used to attack the 3 space directly ahead of you or the space you are on. * See Arms and Armor for weapons" :titles "Battlemaster, Champion, Congueror, Fencer, Fighter, Master of Arms, Warrior" :stat "Body" :abilitymap (abilitymap "Abdomen Timing of Two" (ability :name "Abdomen Timing of Two" :reference "Abdomen Timing of Two refers to feinting an attack, then striking an enemy as they are retracting from an attack, hitting them in the abdomen with the correct timing of either two moves or two seconds. Although the technique seems relatively simple, Musashi lists this as one of the hardest techniques to time correctly.") "Anvil Strike" (ability :name "Anvil Strike" :summary "* [+1 Damage] when target is adjacent to solid terrain.") :Backlash (ability :name "Backlash") :Bash (ability :name "Bash" :summary "* A quick. powerful smashing maneuver usually performed 'sidearm' with an ax, club, or staff. * Requires: [Blunt Weapon] +1 Initiative +1 Damage Criticals - [Knockback]") "Blade Barrier" (ability :name "Blade Barrier" :summary "* Creates a 3 space wide [Wall] directly in front of the unit by rapidly swinging the blade in a flashy display. Anything crossing this wall is subject to an [Opportunity Attack]." :titles "Wall of Swords") "Blind Fighting" (ability :name "Blind Fighting") "Combat Sense" (ability :name "Combat Sense") "Continuous Cut" (ability :name "Continuous Cut" :reference "The Flowing Water Cut is used when you are struggling blade to blade with the enemy. When he breaks and quickly withdraws trying to spring with his sword, expand your body and spirit and cut him as slowly as possible with your long sword, following your body like stagnant water. - Miyamoto Mushashi, The Book of Five Rings" :summary "* [Reaction]: [+1 Defense]. If you are not hit, you may immediately attack as a free action at [-1 Attack]." :titles "Flowing Water Cut") "Dash Attack" (ability :name "Dash Attack" :summary "* [Requires]: May only move in a straight line this turn. * [Action]: [-1 Attack], May attack any number of adjacent opponents along path each at a cumulative -1.") "Dazing Blow" (ability :name "Dazing Blow" :summary "-2 Damage Damage - [Stun] Criticals - [Stun]" :titles "Pommel Strike") "Dual Wield" (ability :name "Dual Wield" :reference "* Not used on the battlefield where a shield would be more practical. * Used primarily for parrying during one on one duels. * Two longsword duelling was done by very skilled fighters in Italian duelling. * Dual katana Japanese styles also exist." :summary "* Using a Dagger, Hand Axe or Hammer in the off hand.") :Feint (ability :name "Feint" :summary "* Feints are maneuvers designed to distract or mislead, done by giving the impression that a certain maneuver will take place, while in fact another, or even none, will." :titles "Kizeme") "Fend Off" (ability :name "Fend Off" :summary "* [Requires]: Weapon with [Reach] * [Reaction]: If you hit with [Fend Off], the opponent may not move any closer to you this turn.") "Fire and Stones Cut" (ability :name "Fire and Stones Cut" :reference "The Fires and Stones Cut means that when the enemy's sword and your sword clash together you cut as strongly as possible without raising the sword even a little. This means cutting quickly with the hands, body and legs - all three cutting strongly. If you train well enough you will be able to strike strongly. - Miyamoto Mushashi, The Book of Five Rings" :summary "* [Reaction]: [+1 Defense] * [Action]: [+1 Attack], if you used this ability to [React] last turn.") :Fleche (ability :name "Fleche" :summary "* A [Lunge] forward where the attacker continues to move forward past the defender to avoid a [Riposte] or Counter Attack. -1 Initiative +1 Move - May only move straight forward. +1 Damage") "Follow Through" (ability :name "Follow Through" :summary "* [Action]: If you hit with this ability, you may immediately turn to the left or right and attack a target in the next adjacent space. This may be repeated any number of times at [-1 Attack] per target after the first though each additional target must be in the same direction.") :Hamstring (ability :name "Hamstring" :summary "* Attack the legs to slow the opponent. * [Action] -1 Accuracy Criticals - [Cripple]") :Impale (ability :name "Impale" :summary "* [Requires]: Spear * [Action] -1 Accuracy Criticals - [Piercing]") :Lunge (ability :name "Lunge") "Offhanded Fighting" (ability :name "Offhanded Fighting" :summary "* [Action]: Normal Attack take a -2 penalty if performed with the non primary hand. This ability negates that penalty when using this skill in the off hand.") :Parry (ability :name "Parry" :summary "* The fighter uses his weapon to block an opponent's attack. * [Reaction] +1 Initiative +2 Defense") "Piercing Strike" (ability :name "Piercing Strike" :summary "* [Action]: Trades damage to increase armor penetration.") "Rapid Strike" (ability :name "Rapid Strike" :reference "In One Timing means, when you have closed with the enemy, to hit him as quickly and directly as possible, without moving your body or settling your spirit, while you see that he is still undecided. The timing of hitting before the enemy decides to withdraw, break or hit, to be able to hit in the timing of an instant. - Miyamoto Mushashi, The Book of Five Rings" :summary "* [Requires]: Wear loose clothing or less. (Armor Penalty = 0). * [Action]: Speed +1, Attack -1" :titles "In One Timing, Lightning Blow") :Riposte (ability :name "Riposte" :reference "When your swords clash together, in one motion when your sword springs away from theirs, use a continuous motion to slash their head, body and legs." :summary "* Speedy attack that can only be performed after a [Parry] or a [Block]. * [Requires]: Previous Action was [Parry] or [Block] +2 Initiative +2 Attack" :titles "Counter Strike") "Set Against Charge" (ability :name "Set Against Charge") :Slash (ability :name "Slash" :summary "* A powerful blow with a cutting weapon. +1 Initative -1 Move +1 Accuracy Criticals - [Bleed]") "Stunning Blow" (ability :name "Stunning Blow" :summary "* [Attack]: Trades lethal damage for stunning damage.") :Sweep (ability :name "Sweep" :summary "* Attack the legs to trip the opponent. +1 Initative -1 Move -1 Damage Criticals - [Knockdown]" :titles "Trip") "There are Many Enemies" (ability :name "There are Many Enemies" :reference "When you are fighting one against many, draw both sword and companion sword and assume a wide-stretched left and right attitude. The spirit is to chase the enemies around from side to side, even though they come from all four directions. Observe their attacking order, and go to meet first those who attack first. Sweep your eyes around broadly, carefully examining the attacking order, and cut left and right alternately with your swords. Waiting is bad. Always quickly re-assume your attitudes to both sides, cut the enemies down as they advance, crushing them in the direction from which they attack. Whatever you do, you must drive the enemy together, as if tying a line of fishes, and when they are seen to be piled up, cut them down strongly without giving them room to move. - Miyamoto Mushashi, The Book of Five Rings" :summary "* [Requires]: [Duel Wield] * [Defense]: If [Surrounded], ignore opponents in front arc when determining [Surrounded] defense penalty.") :Thrust (ability :name "Thrust" :summary "+1 Initiative +1 Move Critcals - [Piercing]") "To Apply Stickiness" (ability :name "To Apply Stickiness" :reference "When the enemy attacks and you also attack with the long sword, you should go in with a sticky feeling and fix your long sword against the enemy's as you receive his cut. The spirit of stickiness is not hitting very strongly, but hitting so that the long swords do not separate easily. It is best to approach as calmly as possible when hitting the enemy's long sword with stickiness. The difference between 'Stickiness' and 'Entanglement' is that stickiness is firm and entanglement is weak. - Miyamoto Mushashi, The Book of Five Rings") "Weapon Block" (ability :name "Weapon Block" :summary "* Deflect, catch, or even turn strike back with a weapon used against the fighter. * This ability provides a second Defense roll against a weapon attack before the regular Defense roll. * [Reaction] +2 Initiative +1 Accuracy 0 Damage - Any successes become -Damage to the weapon. If the weapon has 0 Damage remaining, it is caught. Criticals - Any Criticals become -2 Damage to the weapon. If the weapon has 0 Damage remaining and there are still Criticals, the weapon may be immediately used at +[Criticals] Accuracy. Note: The weapon remains in the hands of the attacker.") "Whirlwind Attack" (ability :name "Whirlwind Attack" :summary "* Allows multiple attacks to different targets by trading accuracy for extra attacks.")) :specialtymap (specialtymap :Bladedancer (specialty :name "Bladedancer" :summary "* A combat technique focusing on elegant moves that efficiently combine attack and defense. Heavy armor may not be used with this technique.") :Fensing (specialty :name "Fensing" :summary "* A combat technique focusing on long quick blades like rapiers and epees." :titles "Fenser") "Sword Saint" (specialty :name "Sword Saint" :summary "* A combat technique focusing almost exclusively on mastery of the sword." :titles "Kensai, Kensei") :Axes (specialty :name "Axes" :reference "* Run to the bedroom, In the suitcase on the left You'll find my favorite axe. Don't look so frightened This is just a passing phase, One of my bad days. - Pink Floyd, One of My Turns" :titles "Axeman") "Flexible Weaponry" (specialty :name "Flexible Weaponry" :summary "* Backlash, Disarm, Trip" :titles "Hangman, Strangler") :Hammers (specialty :name "Hammers" :summary "* War hammers were developed as a consequence of the ever more prevalent metal armors of the medieval battlefields during the 14th and 15th centuries. Swords were of little use against these armors. The war hammer could deal blows of tremendous force to the target, especially when mounted on a pole, and by impact alone do damage without penetrating the armor. The spike end could be used for grappling the target's armour, reins, or shield, or could be turned in the direction of the blow to pierce even heavy armor. Against mounted opponents, the weapon could also be directed at the legs of the horse, toppling the armored foe to the ground where he could be more easily attacked. * See Arms and Armor for weapons") "Short Blades" (specialty :name "Short Blades" :summary "* Includes Short Swords, Daggers, Stilettos, Machetes, Large Kitchen Knives, etc.") :Polearms (specialty :name "Polearms" :summary "Fend Off" :titles "Glaivemaster, Halberdier, Poleman") :Spears (specialty :name "Spears" :summary "Fend Off, Impale, Set Against Charge, Shield Snare" :titles "Lancer, Javelineer, Myrmidon, Peltast, Pikeman, Spartan, Spearman, Velite") :Staves (specialty :name "Staves" :summary "* This specialty includes long staves and short sticks. Staves have longer reach than most weapons while fighting sticks attack with great speed. * [Bash], [Dazing Blow], [Disarm], [Fend Off], [Fleche], [Parry], [Riposte], [Sweep]" :titles "Arnis, Bojutus, Escrima, Kali, Stick Fighting") :Swords (specialty :name "Swords" :reference "The Book of Five Rings - Miyamoto Mushashi The Gaze * The gaze should be large and broad. This is the twofold gaze 'Perception and Sight'. Perception is strong and sight weak. * In strategy it is important to see distant things as if they were close and to take a distanced view of close things. It is important in strategy to know the enemy's sword and not to be distracted by insignificant movements of his sword. The gaze is the same for single combat and for large-scale combat. * It is necessary in strategy to be able to look to both sides without moving the eyeballs. You cannot master this ability quickly. Learn what is written here: use this gaze in everyday life and do not vary it whatever happens. The Five Attitudes * The five attitudes are: Upper, Middle, Lower, Right Side, and Left Side. These are the five. * Although attitude has these five dimensions, the one purpose of all of them is to cut the enemy. * There are none but these five attitudes. * Whatever attitude you are in, do not be conscious of making the attitude; think only of cutting. * Middle Attitude - Confront the enemy with the point of your sword against his face. When he attacks, dash his sword to the right and 'ride' it. Or, when the enemy attacks, deflect the point of his sword by hitting downwards, keep your long sword where it is, and as the enemy renews the attack cut his arms from below. * When you master my Way of the long sword, you will be able to control any attack the enemy makes. I assure you, there are no attitudes other than the five attitudes of the long sword of NiTo. * Upper Attitude - From the Upper attitude cut the enemy just as he attacks. If the enemy evades the cut, keep your sword where it is and, scooping from below, cut him as he renews the attack. * You will always win with the five long sword methods. You must train repeatedly. * Lower Attitude - Adopt the Lower attitude, anticipating scooping up. When the enemy attackes, hit his hands from below. As you do so, he may try to hit your sword down. If this is the case, cut his upper arm(s) horizontally with a feeling of 'crossing'. This means that from the Lower attitudes you hit the enemy at the instant that he attacks. You will encounter this method often, both as a beginner and in later strategy. * Left Side Attitude - Adopt the Left Side attitude. As the enemy attacks, hit his hands from below. If as you hit his hands he attempts to dash down your sword, with the feeling of hitting his hands, parry the path of his long sword and cut across from above your shoulder. Through this method you win by parrying the line of the enemy's attack. * Right Side Attitude - In the fifth approach, the sword is in the Right Side attitude. In accordance with the enemy's attack, cross your sword from below at the side to the Upper attitude. Then cut straight from above. * Cut and Slash - To cut and slash are two different things. Cutting, whatever form of cutting it is, is decisive, with a resolute spirit. Slashing is nothing more than touching the enemy. Even if you slash strongly, and even if the enemy dies instantly, it is slashing. When you cut, your spirit is resolved. You must appreciate this. If you first slash the enemy's hands or legs, you must then cut strongly. Slashing is in spirit the same as touching. When you realise this, they become indistinguishable. Learn this well." :summary "* Melee - [Abdomen Timing of Two], [Continuous Cut], [Dash Attack], [Dazing Blow], [Fleche], [Fire and Stones Cut], [Parry], [Riposte], [Slash], [There Are Many Enemies], [Thrust], [To Apply Stickiness]" :titles "Bushi, Fencer, Fencing, Kendo, Kenjutsu, Kensei, Ronin, Sword Saint, Samurai, Swordsman"))) :Ranged (skill :name "Ranged" :reference "* Good. Bad. I'm the guy with the gun. - Ash, Army of Darkness" :titles "Archer, Javelineer, Slinger" :abilitymap (abilitymap "Arcing Fire" (ability :name "Arcing Fire" :summary "* [Requires]: Bow or Javelin * May fire over other units that block Line of Sight.") "Barbed Javelin" (ability :name "Barbed Javelin" :summary "* [Requires]: Javelin * Criticals vs Large units are [Rage] Tokens.") "Bowel Raker" (ability :name "Bowel Raker" :summary "* +1 [Bleeding] * -1 [Piercing]" :titles "Serrated Arrow") "Deadly Arrow" (ability :name "Deadly Arrow" :summary "* [Requires]: Bow or Crossbow * Increase weapon range by 50% and choose [Hit Location]") "Double Shot" (ability :name "Double Shot" :summary "* -2 [Attack] * -1 [Piercing] * May attack two targets in same [Arc]." :titles "Double Throw") "Explosive Shot" (ability :name "Explosive Shot" :summary "* [Requires]: Bow or Crossbow") "Flaming Arrow" (ability :name "Flaming Arrow" :summary "* [Requires]: Bow or Crossbow") :Fletching (ability :name "Fletching" :summary "* The art of making arrows. High quality or specialized arrows are quickly used up and often impractical to buy. Creating your own is often a very practical solution." :titles "Bowyer") "Knife Throwing" (ability :name "Knife Throwing") "Piercing Shot" (ability :name "Piercing Shot" :summary "* [Requires]: Bow or Crossbow * [Attack]: [+1 Armor Piercing]") :Richochet (ability :name "Richochet" :summary "* [Requires]: Thrown Object") "Shield Snare" (ability :name "Shield Snare" :summary "* [Requires]: Javelin, Target with shield * [Attack]: Criticals are [Encumberance] Tokens.") "Signal Shot" (ability :name "Signal Shot" :summary "* Alert allied units by sending a prearranged signal. This can be flaming arrow at night, smoking arrow, singing arrow, etc. * [Requires]: Bow or Crossbow * [Action]: For the rest of the turn, other units adjacent to this unit may be treated as if under the [Sphere of Command] of any allied Commander.") "Stunning Throw" (ability :name "Stunning Throw" :summary "* [Requires]: Thrown Object * Trades lethal damage for stunning damage.")) :specialtymap (specialtymap :Archery (specialty :name "Archery" :summary "* Bowel Raker, Double Shot, Flaming Arrow" :titles "Archer, Archer Elite, Bowman, Crossbowman, Longbowman") "Thrown Weapons" (specialty :name "Thrown Weapons" :reference "You? You're very good. But me? I'm magic. - Bullseye, Daredevil Comics" :summary "* Barbed Javelin, Double Shot, Knife Throwing, Precision Throw, Shield Snare" :titles "Knife Thrower, Javelineer, Slinger"))) :Firearms (skill :name "Firearms" :titles "Crackshot, Marksman, Rifleman, Sharpshooter, Sniper" :abilitymap (abilitymap :Anti-Personnel (ability :name "Anti-Personnel" :summary "* [Action]: [+1 Damage] or [-1 Damage] vs. 2 or more Armor" :titles "Hollow Point") "Armor Piercing" (ability :name "Armor Piercing" :summary "* [Action]: Enemy at [-2 Armor]" :titles "Depleted Uraniumn") :Autofire (ability :name "Autofire" :summary "* [Requires]: Weapon with [Autofire] -1 [Attack] * [Action]: Target 2 adjacent units.") "Chemical Rounds" (ability :name "Chemical Rounds" :summary "* [Action]: [-1 Damage], [Critical Hits] are [Acid]") "Fast Draw" (ability :name "Fast Draw" :summary "* [Requires]: Hand weapon * Spend 1 Speed to draw a Hand weapon from holster to hip where he can [Shoot From The Hip].") "Gyrojet Rounds" (ability :name "Gyrojet Rounds" :summary "* [Action]: [+1 Damage] at Long Range, [-1 Damage] at Short Range" :titles "Rocket Rounds") "High Explosive Rounds" (ability :name "High Explosive Rounds" :summary "* [Action]: Use [Blast] rules for targetting and damage." :titles "Explosive Rounds") :Hipshoot (ability :name "Hipshoot") "Non-Lethal Rounds" (ability :name "Non-Lethal Rounds" :summary "* [Action]: [-2 Damage] vs. 2 or more Armor. Half of all [Damage] is [Stun] instead." :titles "Rubber Bullets") "Paint Rounds" (ability :name "Paint Rounds" :summary "* [Action]: [0 Damage], [Critical Hits] are [Stun]" :titles "Paintball") "Pin Down" (ability :name "Pin Down") "Rapid Fire" (ability :name "Rapid Fire") :Scattershot (ability :name "Scattershot" :summary "* Choose a target starting from the closest. * If a hit is scored, roll another attack on the same target. * If no hit scored, roll against next target. * -1 for each Space of Range (Cone), -1 per roll (cumulative, inclusive). * Criticals can be used for additional damage rolls (multiple Hits) * If target was [Armor], that Armor is at +2 vs this attack" :titles "Glaser, Shot") :Sniper (ability :name "Sniper" :reference "* The snipe (a family of shorebirds) is difficult to catch for experienced hunters, so much so that the word 'sniper' is derived from it to refer to anyone skilled enough to shoot one. * I aim to win and my aim... is Excellent. - Caitlyn, Runeterra" :summary "* [Requires]: Long Range Weapon * Increase weapon range by 50% and choose [Hit Location]") "Supressive Fire" (ability :name "Supressive Fire" :summary "* Firing weapons at enemy forces with the primary goal of forcing them to remain under cover. * [Requires]: Weapon with [Autofire] * [Action]: Target a unit that has not been activated this turn, all [Hits] and [Critical Hits] are [Stun] tokens. +1 Attack" :titles "Covering Fire") "Tracer Rounds" (ability :name "Tracer Rounds" :summary "* [Requires]: [Auto], Must attack same target on subsequent round. * [Action]: [+1 Attack], [-1 Damage].") "Tracking Rounds" (ability :name "Tracking Rounds") :Auto (ability :name "Auto" :summary "+1 Cost * Criticals can be used for additional damage rolls (multiple hits).") :Blast (ability :name "Blast") :Bombardment (ability :name "Bombardment") :Capacitors (ability :name "Capacitors" :summary "* Uses capacitors that can recharge 1 shot a turn from a power source rated at the same power level as a single shot. Cannot be used with lower energy power sources.") :Electroshock (ability :name "Electroshock" :titles "Taser") "Extra Ammo" (ability :name "Extra Ammo" :summary "* 2x number of shots, each time this modifier is taken.") "Flash Surpressor" (ability :name "Flash Surpressor" :summary "* Reduces the muzzle flare of the weapon making it more difficult to visually locate the shooter.") "Gun Mount" (ability :name "Gun Mount" :titles "Bipod, Tripod") :Overcharge (ability :name "Overcharge" :summary "* [Action]: Consume 2 shots to to 1 extra damage. Then Damage is -1 until repaired.") "Overload Weapon" (ability :name "Overload Weapon" :summary "* Detonate the entire weapon magazine (and the weapon) as an explosive with force equal to the total power in the magazine.") :Rechargable (ability :name "Rechargable" :summary "* Uses batteries that can be slowly recharged from any power source.") "Recoil Compensator" (ability :name "Recoil Compensator" :summary "* Reduces the 'kick' of the weapon and therefore reduces the penalty for continuous fire.") :Silencer (ability :name "Silencer") "Smoke Generator" (ability :name "Smoke Generator") "Targeting Laser" (ability :name "Targeting Laser") "Telescopic Sight" (ability :name "Telescopic Sight" :summary "Reduces penalties for Medium Range to Short Range and Long Range to Medium Range") :Turret (ability :name "Turret" :image "Tokens/Arrow.png" :summary "+1 Cost * Turret mounted weapons may turn their turret toward any direction and fire from the side the turret is facing. * Turrets are normally assumed to be facing forward. At the beginning of its [Action], a unit may change the turret facing by 1 side (Use a [Vector] Token) indicate where the Turret is pointing.")) :specialtymap (specialtymap "Energy Weapons" (specialty :name "Energy Weapons" :reference "Whoa, whoa, whoa! Nice shootin', Tex! - Ghostbusters") :Handguns (specialty :name "Handguns") :Rifles (specialty :name "Rifles") :Shotguns (specialty :name "Shotguns"))) :Gunnery (skill :name "Gunnery" :summary "* Gunnery skill cannot exceed level 5 - Because advanced weapons are mostly point and shoot, weapon skill has less to do with the gunner and more to do with the weapon and its control system. Further, advanced weapons technologies come in a multitude of variations with constantly changing interfaces therefore it is very difficult to dedicate oneself to a single system to become an expert. * See Arms and Armor for weapons" :titles "Artillerist, Bombardier, Field Ops, Gunner" :abilitymap (abilitymap "Air Burst" (ability :name "Air Burst") :Barrage (ability :name "Barrage" :summary "A barrage is a line or barrier of exploding shells from a large number of guns firing continuously. Its purpose is to deny or hamper enemy passage. It contrasts with a concentration, in which all the guns aim at the same small area. The barrage was developed in World War I, with the infantry following the advancing barrage. Its employment in this way recognised the importance of artillery fire in neutralising, rather than destroying, the enemy. A creeping barrage immediately followed by an infantry assault could be far more effective than weeks of preliminary bombardment.") "Forward Observer" (ability :name "Forward Observer" :summary "* [Action]: When unit has [Line of Sight] on a opponent, any number of units with [Indirect Fire] may attack that unit even if they do not have [Line of Sight].") "Indirect Fire" (ability :name "Indirect Fire" :summary "-2 Attack -2 Damage * Other units do not block [Line of Sight]. * See: [Forward Observer] * See: [HE - High Explosives]") "Point Defense" (ability :name "Point Defense") :Salvo (ability :name "Salvo" :summary "* The simultaneous discharge of weapons, rather than scattered 'fire at will'. * Up to 10 weapons of the same type can be in 1 Salvo. * All targets in the space are attacked.")) :specialtymap (specialtymap :Cannons (specialty :name "Cannons") :Flamethrowers (specialty :name "Flamethrowers") :Machineguns (specialty :name "Machineguns"))) "Physical Power" (skill :name "Physical Power" :summary "* This skill is used when manifesting and controlling a [Power] that directly affect physical objects. * Physical Powers must have clear range and line of sight on a target." :stat "Body" :abilitymap (abilitymap "Gunnery Power" (ability :name "Gunnery Power" :summary "* Use [Gunnery] and a Gunnery item instead of [Physical Power] to manifest a [Physical] [Ability] on contact.") "Firearm Power" (ability :name "Firearm Power" :summary "* Can use [Firearms] and Firearm item instead of [Physical Power] to manifest a [Physical] [Ability] on contact.") "Close Combat Power" (ability :name "Close Combat Power" :summary "* Can use [Close Combat] instead of [Physical Power] to manifest a [Physical] [Ability] on contact.") "Melee Power" (ability :name "Melee Power" :summary "* Use [Melee] and a Melee item instead of [Physical Power] to manifest a [Physical] [Ability] on contact.") "Ranged Power" (ability :name "Ranged Power" :summary "* Can use [Ranged] and a Ranged item of [Physical Power] to manifest a [Physical] [Ability] on contact."))) "Mental Power" (skill :name "Mental Power" :summary "* This skill is used when manifesting and controlling a [Power] that directly affect the [Mind] of targets. * Mental Powers must have range and be able to 'see' the target." :titles "Mental Challenge" :stat "Mind" :abilitymap (abilitymap "Mental Grip" (ability :name "Mental Grip") "Mental Gymnastics" (ability :name "Mental Gymnastics") "Mind Whip" (ability :name "Mind Whip") "Psionic Blade" (ability :name "Psionic Blade") "Psionic Knife" (ability :name "Psionic Knife") "Intellect Fortress" (ability :name "Intellect Fortress"))) "Psychic Power" (skill :name "Psychic Power" :summary "* This skill is used when manifesting and controlling a [Power] that directly affect the [Will] of targets. * Psychic Powers must have range and see or 'know' the target." :titles "Psychic Combat, Psychological Warfare, Soul Combat, Spirit Combat, Test of Will" :stat "Will" :abilitymap (abilitymap "Ego Whip" (ability :name "Ego Whip") "Psychic Knife" (ability :name "Psychic Knife") "Tower of Iron Will" (ability :name "Tower of Iron Will"))) :Command (skill :name "Command" :reference "* Generals are in the business of getting people killed. Captains like to keep theirs alive. You wanna put on a parade? Go find a general. You wanna fight your way home? Talk to me. - Obregon Kaine, Negation Comic * Well hello mister fancy pants. I got news for you pal. You ain't leading but two things right now: Jack and Shit and Jack left town. - Ash, Army of Darkness * And when Alexander saw the breadth of his domain, he wept for there were no more worlds to conquer. - Hans Gruber, Die Hard" :titles "Captain, Castellan, Commander, Drillmaster, Drill Sergeant, Major, Overlord, Sergeant, Warchief, Warlord" :stat "Mind" :abilitymap (abilitymap "Call to Arms" (ability :name "Call to Arms" :reference "Unite. Take up arms. Stand shoulder to shoulder with your brothers and sisters. And break free from the cold shackles of oppression. Liberty for all is more noble than the preservation of one's soul. Destiny and valor will meet at the end of the sword. And the tales of heroic sacrifice will be the legend of a new age. There will be no respite. There will be no surrender. Only glory and honor. The price will be high for the greatest prize of all. Stand and be counted among those that dared. Those who dared to fight for their freedom. - Glass Fleet" :summary "Gather a war party from the populace") "Chain of Command" (ability :name "Chain of Command" :summary "* [Action]: [Activate] up to [Command] units directly or indirectly adjacent to this unit. These units (including this one) may spend [Speed] or [Actions] in any order this [Turn]. * [Interrupt]: May not be used as an Interrupt.") :Rally (ability :name "Rally"))) :Military (skill :name "Military" :reference "* He can't make that kind of decision. He's just a grunt! No offense. None taken - Burke and Hicks, Aliens * I think we'd better split up...Yeah... we can do more damage that way. - Ghostbusters * If ten times the enemy's strength, surround them; If five times, attack them; If double, divide them; If equal, be able to fight them; If fewer, be able to evade them; If weaker, be able to avoid them. - Sun Tzu * Warfare is the art of deception. Thus although you are capable, display incapability to them. When your objective is nearby, make it appear distant; when it is far away, create the illusion of being nearby. - Sun Tzu, The Art of War" :titles "Admiral, Brigade, Brigadier, Cadet, Centurion, Colonel, Commander, Commando, Conscript, Corporal, Field Marshal, Footman, Gamesman, General, Grunt, High Guard, Honor Guard, Infantry, Legionnaire, Lieutenant, Praetor, Praetorian Guard, Reserves, Royal Guard, Soldier, Soldier of Fortune, Strategist, Tactician, Vanguard" :stat "Will" :abilitymap (abilitymap "Airborne Assault" (ability :name "Airborne Assault") "Amphibious Assault" (ability :name "Amphibious Assault") :Besiege (ability :name "Besiege") "Bomb Disposal" (ability :name "Bomb Disposal" :reference "* I'll tell you a dirty little secret. When you're in the middle of an explosion, it's the ultimate rush. - Haggerty, Obliterated * Who has one thumb and just saved Las Vegas? This guy! - Hagerty, Obliterated") "Close Assault" (ability :name "Close Assault" :summary "* [Action]: If a [Vehicle] is adjacent to this unit, you may target the Top Armor. If the unit has explosives, it may target the Under Armor.") "Combat Driver" (ability :name "Combat Driver" :summary "* Experienced in fighting in a car.") :Demolitions (ability :name "Demolitions" :summary "* Experienced with setting up large explosives to destroy large structures.") "Divide and Conquer" (ability :name "Divide and Conquer") "Diversionary Tactics" (ability :name "Diversionary Tactics") :Explosives (ability :name "Explosives" :summary "* Experienced using various small explosives in combat.") "Field Fortifications" (ability :name "Field Fortifications") "Formation: Back to Back" (ability :name "Formation: Back to Back" :summary "* [Formation]: Not strictly a formation, units with their backs against each other largely protect each other's back.") "Formation: Cover" (ability :name "Formation: Cover" :summary "* [Formation]: Not strictly a formation, units in Cover formation stay close enough together to protect each other's sides.") "Formation: March" (ability :name "Formation: March" :summary "* [Formation]: Units move in columns. * [+1 Speed]") "Formation: Parade" (ability :name "Formation: Parade" :summary "* [Formation]: A showy formation designed to look good. Has no use in battle. * [+ 1 Intimidation]") "Formation: Phalanx" (ability :name "Formation: Phalanx" :reference "* With his friends jostling and pushing on both sides and behind, and his enemies forming a solid wall in front of him, the hoplite had little opportunity for feats of technique and weapon skill, but great need for commitment and mental toughness. The hoplites had to trust their neighbors for mutual protection, so a phalanx was only as strong as its weakest elements. Its effectiveness depended on how well the hoplites could maintain this formation while in combat, and how well they could stand their ground, especially when engaged against another phalanx. The more disciplined and courageous the army, the more likely it was to win. The Greek word dynamis, the 'will' or 'ability to fight,' was used to express the drive that kept hoplites in formation." :summary "* [Formation]: Focuses on offense using Melee attacks with Reach. * [Requires]: At least half must have Weapons with Reach 2+. * [+1 Attack], [+1 Defense] from Front * [-1 Defense] from Rear") "Formation: Shield Wall" (ability :name "Formation: Shield Wall" :summary "* [Formation]: Uses shields to form a wall. * [Requires]: At least half must have Shields. +1 Defense from Front.") "Formation: Skirmish" (ability :name "Formation: Skirmish" :reference "Acting as light infantry with their light arms and minimal armor, they could run ahead of the main battle line, release a volley of arrows, slingshots or javelins, and retreat behind their main battle line before the clash of the opposing main forces. The aims of skirmishing were to disrupt enemy formations by causing casualties before the main battle, and to tempt the opposing infantry into attacking prematurely, throwing their organization into disarray. Skirmishers could also be effectively used to surround opposing soldiers in the absence of friendly cavalry." :summary "* [Formation]: Units move in loose shapes. * [Requires]: Only [Light Infantry]. * [Move]: Ignore 1 [Terrain Penalty]. * [+1 Defense] vs Ranged or Large Units * [+1 Defense] when in Terrain with Defense bonus * [-1 Defense] vs Small Melee and Close Combat Units" :titles "Skirmisher") "Formation: Testudo" (ability :name "Formation: Testudo" :image "Skills/Testudo.jpg" :summary "* [Formation]: Uses shields to form a shell around a unit. * [Requires]: At least half must have Shields. * [+2 Defense] vs Ranged * Shields protect all sides * Cannot Attack" :titles "Tortoise Formation, Turtle Up") "Formation: Tight" (ability :name "Formation: Tight" :summary "* [Formation]: Units stay tightly packed to maximize Melee defense. * [+1 Defense] vs Melee and Close Combat. * [-1 Defense] vs Ranged") "Formation: Wedge" (ability :name "Formation: Wedge" :summary "* [Formation]: Units move in triangle and focus on breaking enemy formations. * [+1 Retreat] Token if unit inflicts at least 1 [Retreat].") :Fortifications (ability :name "Fortifications") "Halo Drop" (ability :name "Halo Drop") "Jump Suit Combat" (ability :name "Jump Suit Combat") "Military Vehicle" (ability :name "Military Vehicle" :summary "* Every vehicle unit is assumed to have this ability. Units that are not vehicles must take this ability for each vehicle.") "Mine Clearing" (ability :name "Mine Clearing") "Mine Laying" (ability :name "Mine Laying") "Mobile Infantry" (ability :name "Mobile Infantry" :summary "* Experienced with powered armor.") "Orbital Halo Drop" (ability :name "Orbital Halo Drop") "Parachute Assault" (ability :name "Parachute Assault") :Sapping (ability :name "Sapping" :reference "* If it was important, then they should have built it better. - Desert Naturalist, Runeterra") "Space Combat" (ability :name "Space Combat") "Urban Assault" (ability :name "Urban Assault") "Wingsuit Combat" (ability :name "Wingsuit Combat")) :specialtymap (specialtymap :Siegecraft (specialty :name "Siegecraft" :summary "* Besiege * Fortifications * Sapping" :titles "Sapper"))))))) "Early Weaponry" (chapter :name "Early Weaponry" :sectionmap (sectionmap "Early Firearms" (section :name "Early Firearms" :itemmap (itemmap "Matchlock Pistol" (item :name "Matchlock Pistol" :summary "1400s") "Matchlock Rifle" (item :name "Matchlock Rifle" :summary "1400s") "Wheellock Pistol" (item :name "Wheellock Pistol" :summary "1500s") "Wheellock Rifle" (item :name "Wheellock Rifle" :summary "1500s") "Flintlock Pistol" (item :name "Flintlock Pistol" :summary "1600s") "Flintlock Rifle" (item :name "Flintlock Rifle" :summary "1600s") "Dueling Pistol" (item :name "Dueling Pistol" :summary "1770") "Brown Bees Rifle" (item :name "Brown Bees Rifle" :summary "1700s") "Percussion Pistol" (item :name "Percussion Pistol" :summary "1800s") "Percussion Rifle" (item :name "Percussion Rifle" :summary "1800s"))))) "Modern Equipment" (chapter :name "Modern Equipment" :sectionmap (sectionmap "Weapons of Mass Destruction" (section :name "Weapons of Mass Destruction" :itemmap (itemmap "Agent Orange" (item :name "Agent Orange") :Napalm (item :name "Napalm") "Cluster Bomb" (item :name "Cluster Bomb") "Smart Bomb" (item :name "Smart Bomb") "Block Buster" (item :name "Block Buster") "Bunker Buster" (item :name "Bunker Buster") "Fuel Air Explosive" (item :name "Fuel Air Explosive") "Naval Mine" (item :name "Naval Mine") "Nuclear Bomb" (item :name "Nuclear Bomb") "Fusion Bomb" (item :name "Fusion Bomb") "Dirty Bomb" (item :name "Dirty Bomb") "Nerve Gas Bomb" (item :name "Nerve Gas Bomb") :MIRV (item :name "MIRV") "Neutron Bomb" (item :name "Neutron Bomb") "Plague Bomb" (item :name "Plague Bomb") "Tactical Nuclear Bomb" (item :name "Tactical Nuclear Bomb") "Tactical Nuclear Cruise Missile" (item :name "Tactical Nuclear Cruise Missile") "Strategic Nuclear Bomb" (item :name "Strategic Nuclear Bomb") "Nuclear Cruise Missile" (item :name "Nuclear Cruise Missile") "Nuclear Ballistic Missile" (item :name "Nuclear Ballistic Missile"))))) "Advanced Weaponry" (chapter :name "Advanced Weaponry" :sectionmap (sectionmap "Futuristic Weapons of Mass Destruction" (section :name "Futuristic Weapons of Mass Destruction" :itemmap (itemmap "Spinal Nava Cannon" (item :name "Spinal Nava Cannon") "Spinal Rail Gun" (item :name "Spinal Rail Gun") "Spinal Wave Cannon" (item :name "Spinal Wave Cannon" :summary "* An enormously powerful energy cannon capable of enormous damage over a large area." :titles "Death Star Cannon, Wave Motion Gun")) :unitmap (unitmap "Star Mine" (unit :name "Star Mine" :summary "* Star Mines are basically Star Torpedoes that have been left floating in space near likely enemy traffic. The mines are smart and will only attack selected targets and can act as spy satellites by transmitting what their sensors are picking up. When given the order, the Star Mine rockets off toward its victim. Though inefficient in space because of the vast distances, they still can be effective by limiting an opponent's options or when used as traps at key locations." :titles "Space Mine") "Sentry Spy Satellite" (unit :name "Sentry Spy Satellite" :summary "* Sentry Spy Satellites are small disposable surveillence satellites that are hidden in asteroid or debris fields to monitor activity and transmit that information back home. They are sometimes armed with a Star Torpedo for a surprise attack.") "Star Torpedo" (unit :name "Star Torpedo" :summary "* Star Torpedoes carry Nuclear weapons (tactical or greater). In space, nuclear weapons produce no shockwave, just intense radiation. Even direct hits are not guaranteed to pierce the diamond hard ceramic armor of modern warships, so penetration is critical.") "Colony Drop" (unit :name "Colony Drop" :reference "Mobile Suit Gundam") "Planet Bomb" (unit :name "Planet Bomb" :reference "Star Blazers, Starship Troopers" :summary "* Asteroids or comets redirected to fall on a planet.") "Plague Planet Bomb" (unit :name "Plague Planet Bomb" :summary "* An enormous, genocidal planet bomb that releases a series of infectious diseases to infect a population. Victims do not immediately show signs of infection to maximize the contagion and paranoia.") "Rage Planet Bomb" (unit :name "Rage Planet Bomb" :summary "* An enormous, genocidal planet bomb that releases a series of parasites that turns infected creatures into rabid killers who spread the infection.") "Famine Planet Bomb" (unit :name "Famine Planet Bomb" :summary "* An enormous, genocidal planet bomb that releases a series of diseases that attack the food harvest of a planet attempting to break the food chain and cause mass starvation or force compliance.") "Pestilence Planet Bomb" (unit :name "Pestilence Planet Bomb" :summary "* An enormous, genocidal planet bomb that releases a series of parasites that infect insects, birds, and vermin. These creatures gain accelerated reproduction and high aggression to attack food supplies and the general population.") "Terraforming Planet Bomb" (unit :name "Terraforming Planet Bomb" :reference "Genesis - Star Trek II") "Hellbore Planet Bomb" (unit :name "Hellbore Planet Bomb" :summary "* A missile that detonates a series of shaped nuclear blasts to tunnel into a geological fault or a volcano where it attempts to cause a massive natural disaster.") "Planet Buster" (unit :name "Planet Buster" :reference "Anti-Matter Missile - Star Blazers" :summary "* A missile designed to be part of a massive bombardment to shatter a planet's crust and return it to a molten state. Already unstable planets may break up into rubble.") "Starkiller Missile" (unit :name "Starkiller Missile" :reference "Sunshine" :summary "* A missile designed to be part of a massive bombardment to disrupt the nuclear chain reaction in a star. This can result in massive solar flares, a cooling of the star, or cause the star to go nova depending on the age and size of the star."))))))))
nx/tactics/books/core_rules
Description:
Package Name:
  • nx/tactics/books/core_rules
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
Functions:
  • tacticsbook
Source Code:
  • (package nx/tactics/books/core_rules :libs (lib base :path nx/tactics/base)) (func tacticsbook : base/book (book :name "Core Rules" :image "warrior_msleal_full.jpg" :chaptermap (chaptermap "Core Overview" (chapter :name "Core Overview" :summary "* Round - Each Unit takes their turn. When all Units have taken their turn or passed, the Round ends. * Turn - Each Unit takes a Turn during a Round. ** Turn Order - Units take turns in order of the highest [Body] to lowest. The largest units are the most predictable and must activate first. ** Facing - At any time during your turn, you may change your facing by 45 degrees to any adjacent direction of the 8 compass directions. You may change your facing a maximum of 2 times (a total of 90 degrees) during your turn regardless of how many Move actions you take. ** Actions - The current may take up to 2 Actions during its Turn. *** Move **** Simple Move - **** Accelerate - **** Brake - **** Drift - ** Interrupt - During the Unit's Move, any smaller Unit may interrupt the current Unit and take its Turn immediately. When it has finished its Turn, the interrupted Unit continues. Multiple chained interrupts are possible this way. ** Abilities - Each [Unit] may use up to 2 [Abilities] each [Turn]. There are 3 types of [Ability]: [Move], [Attack], and [Action] abilities. They may be performed in any order but there may only be one [Move] or [Attack] [Ability] used in a turn. So the following are the allowed combinations: Move/Attack, Attack/Move, Move/Action, Action/Move, Attack/Action, Action/Attack, Action/Action. Damage Cards: Ammo Damaged Armor Rupture * Armor Breach Cargo Damage * Individual - Lost ammo, water, food * Team - Lost ammo, water, food * Vehicle - Lost fuel, ammo, water, food, reaction mass * Ship - Lost fuel, ammo, water, food (submarine: air) * Starship - Lost fuel, ammo, propellant, air, water, food Crew Damage Command Failure * Command Control Failure - Commands may not be issued to teams outside command. * Helm Control Failure - Cannot change speed or heading until rerouted. * Navigation Control Failure - Cannot plot courses or use maps until rerouted. * Communication Control Failure - Cannot use communications until rerouted. * Sensor Control Failure - Cannot use sensors until rerouted. * Weapon Targetting Control Failure - May only fire at current target with current weapon. Communication Failure Sensor Control Failure * Throttle Failure - Cannot increase speed. * Throttle Failure - Cannot maintain speed. Must increase or decrease speed. * Throttle Failure - Cannot reduce speed. * Steering Failure - Cannot turn left. * Steering Failure - Cannot maintain course. Must turn. * Sterring Failure - Cannot turn right. * Steering Failure - Cannot ascend. * Steering Failure - Cannot maintain altitude. Must ascend or descend. * Sterring Failure - Cannot descend. * Navigation Failure - Cannot plot a course or use maps. * Unstable Controls - Must drift each turn if able. Power Plant Damage * Engine Overheat - -1 Max Power generation * Electrical Short - -1 Max Power generation and chance of fire. * Electrical Overload - 1 Random System loses power until reset. Equipment Failure Fire * Individual - Clothes or hair catches fire * Team * Vehicle - Engine Fire Life Support Failure * Vehicle - * Ship - Air (submarine: heat, pressure) * Starship - Air, heat, pressure Movement Failure * Individual - Leg or Foot Damage * Team - Some members can't move without help. * Vehicle - Flat tire, slipped tread * Ship - * Starship - Reduced Visibility * Individual - Temporay Blindness (Sweat, dust, blood, smoke) * Team - Temporay Blindness (dust, smoke) * Vehicle - (dirt on windshield, smoke) * Ship - Smoke, Sensor Failure * Starship - Sensor Failure Structural Damage * Bulkhead Breach * Hull Breach Weapon Damage" :sectionmap (sectionmap "How does Tactics compare to other games?" (section :name "How does Tactics compare to other games?" :summary "* Vs. Board Games * Board games successfully capture the essence of reality while providing very simple mechanics to allow games to progress quickly and smoothly. The problem with board games is that each game targets only one view of a situation and generally cannot be expanded or modified without breaking the core premise of the game. Generally this leads to numerous different games that describe the same material (e.g. Star Wars). Each game focuses on a different aspect of the material with varying degrees of success and almost no overlap. Once the scenarios of the game are exhausted, the game loses public interest. Tactics seeks to create a system that can absorb new genres and new material and even allow units from different genres to battle one another. It also seeks to allow the elegant game play that board games offer by keeping the core rules simple and expandable. * Vs. Collectible Games * Collectible Games reinvented the classic board game. Instead of fixed rules, the rules were changeable. These changes can take 2 forms: a new expansion set can introduce new rules and environments, and each card may introduce modifications to existing rules. This approach is brilliant when applied correctly. Each expansion can be a standalone game or a supplement to the original game depending on what is agreed upon before play begins. The problems, however, are numerous. Because Collectible Games are extremely profitable, they tend to create unbalanced, 'power' cards that drive up sales but destabilize the game. I suspect that most of the manufacturers are aware of this problem, but because they are profit driven they are unable to avoid this trap. Another brilliant component of Collectible Games is the notion of a player 'building a deck' that is uniquely constructed using the build rules appropriate to the game. This idea allows each match to be entirely unique and variation is only limited by the imagination of the players. The downside of this is again associated with profits. Constructed decks are very expensive. Casual players lack the patience and resources to construct competitive decks, so games heavily favors the richest, most obsessed player instead of the most skilled player. Tactics seeks to avoid these problems by being free, by keeping deck construction rules simple, and by offering a number of preconstructed scenarios. This allows casual players to jump right into the action while allowing hard core players to enjoy themselves by increasing the level of detail instead of increasing the power level. * Vs. Tactical Games * Tactical games have a good understanding of unit tactics, but often do not functionally support individual characters and often over-complicate modifiers and oversimplify rolls and damage. Tactical games are almost universally inappropriate for individual character combat. * Vs. Role-playing Games * RPG games have a strong tactical combat element to them, but they simultaneously over-complicate individual actions while largely ignoring the tactical elements of small unit combat. Tactics attempts to bridge this gap and connect tactical combat with the RPG."))) "Let's Play" (chapter :name "Let's Play" :summary "All games start with Setup, consists of a series of Rounds where each unit gets to move and act, and ends when someone achieves Victory." :sectionmap (sectionmap "Game Over" (section :name "Game Over" :summary "The game ends when any of the following occur: * Last Round Ends * No Enemy Units Remain * Complete Victory condition achieved by any team * Winning - Each [Team] that acheived a [Complete Victory] condition wins. If no [Team] acheived a [Complete Victory], then each [Team] that acheived a [Partial Victory] condition wins. Winners gain the [Rewards] for the scenario, if any. * Ties - Ties are allowed, though any [Rewards] gained are divided by the number of winners."))) "Common Rules" (chapter :name "Common Rules" :sectionmap (sectionmap "Core Terms" (section :name "Core Terms" :rulemap (rulemap :Action (rule :name "Action" :summary "* The [Unit] may spend half of its [Speed] to use any [Ability] on its [Card]. Note: if the [Unit] is only able to move 1 space this turn, it may still take an Action.") :Card (rule :name "Card") :Collision (rule :name "Collision" :summary "* When 2 units collide, they each Roll [Body]+[Speed] vs. [Armor] against each other. * Either, both, or neither may take damage.") :Difficulty (rule :name "Difficulty" :summary "* Easy - Quick Game with Basic Rules * Medium * Difficult * Epic - Maximum complexity (and detail). Often long play or part of a [Campaign].") :Initiative (rule :name "Initiative" :summary "* Initiative is determined by Spirit. Unit act in order of initiative from lowest to highest. Before any Action, a unit with higher initiative may interrupt the current unit and take its turn.") "Large Unit" (rule :name "Large Unit") :Map (rule :name "Map") "Optional Rules" (rule :name "Optional Rules") :Player (rule :name "Player") :Rule (rule :name "Rule") :Scenario (rule :name "Scenario") :Space (rule :name "Space") :Team (rule :name "Team") "Turn Clock" (rule :name "Turn Clock") :Unit (rule :name "Unit"))))) :Tokens (chapter :name "Tokens" :sectionmap (sectionmap :Status (section :name "Status" :rulemap (rulemap :Death (rule :name "Death" :reference "* Tomorrow is a hope, never a promise. - Kindred (Lamb), Runeterra"))))) "Core Scenarios" (chapter :name "Core Scenarios" :sectionmap (sectionmap "Sample Scenarios" (section :name "Sample Scenarios" :scenariomap (scenariomap :Alamo (scenario :name "Alamo" :summary "* One team defends a strong tactical position, from a superior invading army.") :Bandits (scenario :name "Bandits" :summary "* One team carries an unconcealed treasure across the map while the other team tries to steal it.") :Blockade (scenario :name "Blockade" :summary "* One team must successfully cross the map with half of their units. The other team must stop them.") "Capture the Flag" (scenario :name "Capture the Flag" :summary "* Each team protects their battle standard. The other team tries to take it.") :Conquest (scenario :name "Conquest" :reference "* Crush your enemies, drive them before you, and hear the lamenting of the women. That is what is best in life. - Conan the Barbarian") "High Score" (scenario :name "High Score" :summary "* Each team tries to score points. High score wins.") "King of the Hill" (scenario :name "King of the Hill" :summary "* Each team attempts to hold a single objective until the clock runs out.") "Treasure Hunt" (scenario :name "Treasure Hunt" :summary "* Place treasures randomly. Each team tries to get more than half of them off the map at their starting location."))))) "Core Maps" (chapter :name "Core Maps" :sectionmap (sectionmap "Core Terrain" (section :name "Core Terrain" :rulemap (rulemap :Building (rule :name "Building" :image "Maps/Building.png" :summary "* [Move]: Impassable by Vehicles * [Defense]: [+1 Defense], Gains [Armor] based on building material and thickness") :Cliff (rule :name "Cliff" :image "Maps/Cliff.png" :summary "* [Move]: Impassable along the cliff edge * [Attack]: +1 [Elevation] * [Defense]: +1 [Elevation]") :Forest (rule :name "Forest" :image "Maps/Forest.png" :summary "* [Move]: [-1 Speed] * [Defense]: [+2 Defense], [+2 Armor], Blocks [Line of Sight]") :Hill (rule :name "Hill" :image "Maps/Hills.png" :summary "* [Move]: [-1 Speed] * [Attack]: [+1 Elevation] * [Defense]: [+1 Elevation], Blocks [Line of Sight] to units behind the hill, but not units on the hill.") :Road (rule :name "Road" :image "Maps/Road.png" :summary "-1 [Speed] for each 2 spaces moved (rounded up)" :titles "Cobblestones, Dirt Road, Gravel, Highway, Racetrack, Sidewalk, Street") :Water (rule :name "Water" :image "Maps/Water.png" :summary "* Impassable * Depth" :titles "Lake, Oasis, Ocean, Pond, Pool, River, Stream, Underwater"))))))))
nx/tactics/books/core_rules / tacticsbook
Description:
Function Name:
  • tacticsbook
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func tacticsbook : base/book (book :name "Core Rules" :image "warrior_msleal_full.jpg" :chaptermap (chaptermap "Core Overview" (chapter :name "Core Overview" :summary "* Round - Each Unit takes their turn. When all Units have taken their turn or passed, the Round ends. * Turn - Each Unit takes a Turn during a Round. ** Turn Order - Units take turns in order of the highest [Body] to lowest. The largest units are the most predictable and must activate first. ** Facing - At any time during your turn, you may change your facing by 45 degrees to any adjacent direction of the 8 compass directions. You may change your facing a maximum of 2 times (a total of 90 degrees) during your turn regardless of how many Move actions you take. ** Actions - The current may take up to 2 Actions during its Turn. *** Move **** Simple Move - **** Accelerate - **** Brake - **** Drift - ** Interrupt - During the Unit's Move, any smaller Unit may interrupt the current Unit and take its Turn immediately. When it has finished its Turn, the interrupted Unit continues. Multiple chained interrupts are possible this way. ** Abilities - Each [Unit] may use up to 2 [Abilities] each [Turn]. There are 3 types of [Ability]: [Move], [Attack], and [Action] abilities. They may be performed in any order but there may only be one [Move] or [Attack] [Ability] used in a turn. So the following are the allowed combinations: Move/Attack, Attack/Move, Move/Action, Action/Move, Attack/Action, Action/Attack, Action/Action. Damage Cards: Ammo Damaged Armor Rupture * Armor Breach Cargo Damage * Individual - Lost ammo, water, food * Team - Lost ammo, water, food * Vehicle - Lost fuel, ammo, water, food, reaction mass * Ship - Lost fuel, ammo, water, food (submarine: air) * Starship - Lost fuel, ammo, propellant, air, water, food Crew Damage Command Failure * Command Control Failure - Commands may not be issued to teams outside command. * Helm Control Failure - Cannot change speed or heading until rerouted. * Navigation Control Failure - Cannot plot courses or use maps until rerouted. * Communication Control Failure - Cannot use communications until rerouted. * Sensor Control Failure - Cannot use sensors until rerouted. * Weapon Targetting Control Failure - May only fire at current target with current weapon. Communication Failure Sensor Control Failure * Throttle Failure - Cannot increase speed. * Throttle Failure - Cannot maintain speed. Must increase or decrease speed. * Throttle Failure - Cannot reduce speed. * Steering Failure - Cannot turn left. * Steering Failure - Cannot maintain course. Must turn. * Sterring Failure - Cannot turn right. * Steering Failure - Cannot ascend. * Steering Failure - Cannot maintain altitude. Must ascend or descend. * Sterring Failure - Cannot descend. * Navigation Failure - Cannot plot a course or use maps. * Unstable Controls - Must drift each turn if able. Power Plant Damage * Engine Overheat - -1 Max Power generation * Electrical Short - -1 Max Power generation and chance of fire. * Electrical Overload - 1 Random System loses power until reset. Equipment Failure Fire * Individual - Clothes or hair catches fire * Team * Vehicle - Engine Fire Life Support Failure * Vehicle - * Ship - Air (submarine: heat, pressure) * Starship - Air, heat, pressure Movement Failure * Individual - Leg or Foot Damage * Team - Some members can't move without help. * Vehicle - Flat tire, slipped tread * Ship - * Starship - Reduced Visibility * Individual - Temporay Blindness (Sweat, dust, blood, smoke) * Team - Temporay Blindness (dust, smoke) * Vehicle - (dirt on windshield, smoke) * Ship - Smoke, Sensor Failure * Starship - Sensor Failure Structural Damage * Bulkhead Breach * Hull Breach Weapon Damage" :sectionmap (sectionmap "How does Tactics compare to other games?" (section :name "How does Tactics compare to other games?" :summary "* Vs. Board Games * Board games successfully capture the essence of reality while providing very simple mechanics to allow games to progress quickly and smoothly. The problem with board games is that each game targets only one view of a situation and generally cannot be expanded or modified without breaking the core premise of the game. Generally this leads to numerous different games that describe the same material (e.g. Star Wars). Each game focuses on a different aspect of the material with varying degrees of success and almost no overlap. Once the scenarios of the game are exhausted, the game loses public interest. Tactics seeks to create a system that can absorb new genres and new material and even allow units from different genres to battle one another. It also seeks to allow the elegant game play that board games offer by keeping the core rules simple and expandable. * Vs. Collectible Games * Collectible Games reinvented the classic board game. Instead of fixed rules, the rules were changeable. These changes can take 2 forms: a new expansion set can introduce new rules and environments, and each card may introduce modifications to existing rules. This approach is brilliant when applied correctly. Each expansion can be a standalone game or a supplement to the original game depending on what is agreed upon before play begins. The problems, however, are numerous. Because Collectible Games are extremely profitable, they tend to create unbalanced, 'power' cards that drive up sales but destabilize the game. I suspect that most of the manufacturers are aware of this problem, but because they are profit driven they are unable to avoid this trap. Another brilliant component of Collectible Games is the notion of a player 'building a deck' that is uniquely constructed using the build rules appropriate to the game. This idea allows each match to be entirely unique and variation is only limited by the imagination of the players. The downside of this is again associated with profits. Constructed decks are very expensive. Casual players lack the patience and resources to construct competitive decks, so games heavily favors the richest, most obsessed player instead of the most skilled player. Tactics seeks to avoid these problems by being free, by keeping deck construction rules simple, and by offering a number of preconstructed scenarios. This allows casual players to jump right into the action while allowing hard core players to enjoy themselves by increasing the level of detail instead of increasing the power level. * Vs. Tactical Games * Tactical games have a good understanding of unit tactics, but often do not functionally support individual characters and often over-complicate modifiers and oversimplify rolls and damage. Tactical games are almost universally inappropriate for individual character combat. * Vs. Role-playing Games * RPG games have a strong tactical combat element to them, but they simultaneously over-complicate individual actions while largely ignoring the tactical elements of small unit combat. Tactics attempts to bridge this gap and connect tactical combat with the RPG."))) "Let's Play" (chapter :name "Let's Play" :summary "All games start with Setup, consists of a series of Rounds where each unit gets to move and act, and ends when someone achieves Victory." :sectionmap (sectionmap "Game Over" (section :name "Game Over" :summary "The game ends when any of the following occur: * Last Round Ends * No Enemy Units Remain * Complete Victory condition achieved by any team * Winning - Each [Team] that acheived a [Complete Victory] condition wins. If no [Team] acheived a [Complete Victory], then each [Team] that acheived a [Partial Victory] condition wins. Winners gain the [Rewards] for the scenario, if any. * Ties - Ties are allowed, though any [Rewards] gained are divided by the number of winners."))) "Common Rules" (chapter :name "Common Rules" :sectionmap (sectionmap "Core Terms" (section :name "Core Terms" :rulemap (rulemap :Action (rule :name "Action" :summary "* The [Unit] may spend half of its [Speed] to use any [Ability] on its [Card]. Note: if the [Unit] is only able to move 1 space this turn, it may still take an Action.") :Card (rule :name "Card") :Collision (rule :name "Collision" :summary "* When 2 units collide, they each Roll [Body]+[Speed] vs. [Armor] against each other. * Either, both, or neither may take damage.") :Difficulty (rule :name "Difficulty" :summary "* Easy - Quick Game with Basic Rules * Medium * Difficult * Epic - Maximum complexity (and detail). Often long play or part of a [Campaign].") :Initiative (rule :name "Initiative" :summary "* Initiative is determined by Spirit. Unit act in order of initiative from lowest to highest. Before any Action, a unit with higher initiative may interrupt the current unit and take its turn.") "Large Unit" (rule :name "Large Unit") :Map (rule :name "Map") "Optional Rules" (rule :name "Optional Rules") :Player (rule :name "Player") :Rule (rule :name "Rule") :Scenario (rule :name "Scenario") :Space (rule :name "Space") :Team (rule :name "Team") "Turn Clock" (rule :name "Turn Clock") :Unit (rule :name "Unit"))))) :Tokens (chapter :name "Tokens" :sectionmap (sectionmap :Status (section :name "Status" :rulemap (rulemap :Death (rule :name "Death" :reference "* Tomorrow is a hope, never a promise. - Kindred (Lamb), Runeterra"))))) "Core Scenarios" (chapter :name "Core Scenarios" :sectionmap (sectionmap "Sample Scenarios" (section :name "Sample Scenarios" :scenariomap (scenariomap :Alamo (scenario :name "Alamo" :summary "* One team defends a strong tactical position, from a superior invading army.") :Bandits (scenario :name "Bandits" :summary "* One team carries an unconcealed treasure across the map while the other team tries to steal it.") :Blockade (scenario :name "Blockade" :summary "* One team must successfully cross the map with half of their units. The other team must stop them.") "Capture the Flag" (scenario :name "Capture the Flag" :summary "* Each team protects their battle standard. The other team tries to take it.") :Conquest (scenario :name "Conquest" :reference "* Crush your enemies, drive them before you, and hear the lamenting of the women. That is what is best in life. - Conan the Barbarian") "High Score" (scenario :name "High Score" :summary "* Each team tries to score points. High score wins.") "King of the Hill" (scenario :name "King of the Hill" :summary "* Each team attempts to hold a single objective until the clock runs out.") "Treasure Hunt" (scenario :name "Treasure Hunt" :summary "* Place treasures randomly. Each team tries to get more than half of them off the map at their starting location."))))) "Core Maps" (chapter :name "Core Maps" :sectionmap (sectionmap "Core Terrain" (section :name "Core Terrain" :rulemap (rulemap :Building (rule :name "Building" :image "Maps/Building.png" :summary "* [Move]: Impassable by Vehicles * [Defense]: [+1 Defense], Gains [Armor] based on building material and thickness") :Cliff (rule :name "Cliff" :image "Maps/Cliff.png" :summary "* [Move]: Impassable along the cliff edge * [Attack]: +1 [Elevation] * [Defense]: +1 [Elevation]") :Forest (rule :name "Forest" :image "Maps/Forest.png" :summary "* [Move]: [-1 Speed] * [Defense]: [+2 Defense], [+2 Armor], Blocks [Line of Sight]") :Hill (rule :name "Hill" :image "Maps/Hills.png" :summary "* [Move]: [-1 Speed] * [Attack]: [+1 Elevation] * [Defense]: [+1 Elevation], Blocks [Line of Sight] to units behind the hill, but not units on the hill.") :Road (rule :name "Road" :image "Maps/Road.png" :summary "-1 [Speed] for each 2 spaces moved (rounded up)" :titles "Cobblestones, Dirt Road, Gravel, Highway, Racetrack, Sidewalk, Street") :Water (rule :name "Water" :image "Maps/Water.png" :summary "* Impassable * Depth" :titles "Lake, Oasis, Ocean, Pond, Pool, River, Stream, Underwater"))))))))
nx/tactics/books/gear
Description:
Package Name:
  • nx/tactics/books/gear
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
Functions:
  • tacticsbook
Source Code:
  • (package nx/tactics/books/gear :libs (lib base :path nx/tactics/base)) (func tacticsbook : base/book (book :name "Gear" :chaptermap (chaptermap "Gear Overview" (chapter :name "Gear Overview" :sectionmap (sectionmap "Why Tactics: Gear?" (section :name "Why Tactics: Gear?"))) "Gear Construction" (chapter :name "Gear Construction") "Gear Items" (chapter :name "Gear Items" :sectionmap (sectionmap "Unfiled Gear" (section :name "Unfiled Gear" :summary "* Acid * Alabaster * Barricade * Blood * Cage * Chariot * Conch Horn * Fireworks * Trumpet * War Machine !Symbols * Banner * Coat of Arms * Crest * Crown * Fasces * Helix * Rod * Scepter * Signet * Standard * Thyrsus !Arcane Items * Airship * Armageddon Clock * Flying Carpet !Containers * Chest * Cauldron * Coffer * Goblet * Jar * Puzzle Box * Vat * Vessel !Technology * [Blinding Bulb] * [Phone Tap]] * [Shotgun Microphone] * [Sleepteacher] * [Subliminal Broadcaster] * [Surveillance Cameras] * [Telephoto Lens]" :itemmap (itemmap "Beast Claw" (item :name "Beast Claw") :Tooth (item :name "Tooth") "Vampire Blood" (item :name "Vampire Blood" :summary "* Black Token * Drinking Vampire Blood is addictive and creates a psychological dependency on the original Vampire called the [[Blood Bond]]. * [Move] - Vampiric Healing - Remove a Vampire Blood Token and remove another Token of your choice. * [Move] - Vampiric Strength - Remove a Vampire Blood Token and gain +1 Melee for 3 turns. * [Move] - Vampiric Speed - Remove a Vampire Blood Token and gain +1 Initiative and +1 Move for 3 turns. * [Move] - Vampiric Fortitude - Remove a Vampire Blood Token and gain +1 Physical Armor for 3 turns.") "Healing Salve" (item :name "Healing Salve") :Lattice (item :name "Lattice") :Mirror (item :name "Mirror") :Matrix (item :name "Matrix") :Candle (item :name "Candle") :Screen (item :name "Screen") :Array (item :name "Array"))))))))
nx/tactics/books/gear / tacticsbook
Description:
Function Name:
  • tacticsbook
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func tacticsbook : base/book (book :name "Gear" :chaptermap (chaptermap "Gear Overview" (chapter :name "Gear Overview" :sectionmap (sectionmap "Why Tactics: Gear?" (section :name "Why Tactics: Gear?"))) "Gear Construction" (chapter :name "Gear Construction") "Gear Items" (chapter :name "Gear Items" :sectionmap (sectionmap "Unfiled Gear" (section :name "Unfiled Gear" :summary "* Acid * Alabaster * Barricade * Blood * Cage * Chariot * Conch Horn * Fireworks * Trumpet * War Machine !Symbols * Banner * Coat of Arms * Crest * Crown * Fasces * Helix * Rod * Scepter * Signet * Standard * Thyrsus !Arcane Items * Airship * Armageddon Clock * Flying Carpet !Containers * Chest * Cauldron * Coffer * Goblet * Jar * Puzzle Box * Vat * Vessel !Technology * [Blinding Bulb] * [Phone Tap]] * [Shotgun Microphone] * [Sleepteacher] * [Subliminal Broadcaster] * [Surveillance Cameras] * [Telephoto Lens]" :itemmap (itemmap "Beast Claw" (item :name "Beast Claw") :Tooth (item :name "Tooth") "Vampire Blood" (item :name "Vampire Blood" :summary "* Black Token * Drinking Vampire Blood is addictive and creates a psychological dependency on the original Vampire called the [[Blood Bond]]. * [Move] - Vampiric Healing - Remove a Vampire Blood Token and remove another Token of your choice. * [Move] - Vampiric Strength - Remove a Vampire Blood Token and gain +1 Melee for 3 turns. * [Move] - Vampiric Speed - Remove a Vampire Blood Token and gain +1 Initiative and +1 Move for 3 turns. * [Move] - Vampiric Fortitude - Remove a Vampire Blood Token and gain +1 Physical Armor for 3 turns.") "Healing Salve" (item :name "Healing Salve") :Lattice (item :name "Lattice") :Mirror (item :name "Mirror") :Matrix (item :name "Matrix") :Candle (item :name "Candle") :Screen (item :name "Screen") :Array (item :name "Array"))))))))
nx/tactics/books/gettingstarted
Description:
Package Name:
  • nx/tactics/books/gettingstarted
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
  • scenario-murin-a0, scenario-murin-a1, scenario-murin-a2
Functions:
Source Code:
  • (package nx/tactics/books/gettingstarted :libs (lib base :path nx/tactics/base) :doc "") (const scenario-murin-a0 : base/scenario (base/scenario :summary "* Prologue - You've been traveling for a while. Odd jobs here and there have kept you fed, but no opportunity has paid off so far. Your funds are desperately low, and you have to consider giving up a life on the road for something more stable, at least for a while. * Setting - You've ended up among the Iron Cross Mountains. This used to be territory enthusiastically protected by the Dwarves who lived below, but thing have been quiet for a few years and human civilization is tentatively spreading into the area. There are said to be numerous mines and jewels to be found in these mountains, but so far they are just stories. You are currently traveling with a couple of religious aspirants and their fanatical followers. They claim to follow the Sun God and must follow him during the day. For some reason the truly feebleminded seem to gather together. Well, even if their beliefs are nonsense, their coin is real at least. * Plot Hooks - A young man (Jos Halslef) with a mule and cart approach from ahead. His clothes are well made but worn, and he does not appear threatening. He engages the group, but soon finds conversation with the aspirants to go nowhere. He suggests coming with him to Murinton.")) (const scenario-murin-a1 : base/scenario (base/scenario :summary "* Murin Vale - Murin Vale is a misty depression huddled between stout Murin-Lead Mountain and the spiky Murin-Quartz Peak. A hundred years ago, this entire area was controlled by the Murin Dwarf Clan who served the [Dwarven Underking] far down the [Deep Roads]. However, long ago, the Dwarves withdrew without explanation. Murinton, their trading village, was adopted by the human traders who no longer had their main trading partner. * Plot Hooks - A rough trail leads through the wooded vale to a small abandoned town, though smoke can be seen rising from its center.")) (const scenario-murin-a2 : base/scenario (base/scenario :summary "* Murinton - Within Murin Vale, at the base of Murin-Lead Mountain is the abandoned, Dwarven village of Murinton. A small populated outpost lies at its center. The outpost is dominated by the 20ft stone doors that lead into Murin-Lead Mountain. The massive doors are carved with dwarven artwork and sealed tight from within. The only occupied buildings are a general store, a smithy, a small grain mill, and some outlying farm houses. A winding stream runs down the mountain and powers the mill. * Personalities - Only 9 people live in this town though there is probably room for a hundred. ** Jen Halslef - Jen Halslef heads the outpost, negotiates deals, and runs the smithy when needed. She founded the town 2 years ago, taking advantage of the free property and safe territory. Maintaining the town has been difficult with so little resources, so she remains concerned for the town's future. Her smithy is dedicated to the god dwarven god Moradin, and has carved tablets around the walls describing smithing and calling on the blessings of Moradin. She was facinated and has been diligently following both to improve her smithing. Unknown to her, Moradin was intrigued by a human female follower and has blessed her. Skills: Tradeskills: 1 (Smithing), Channeling: 1 (Healing). ** Jos Halslef - Jen's twin brother runs the general store, trades with other villages, and keeps the books. The twins had brought a fair quantity of goods to start the town, but after 2 years resources are getting thin. Chicken, Bread, Jam, and Beer are the staple foods in town. Jos brings a homemade short spear with him when he travels and is passable at its use. Skills: Trade: 1 (Haggling), Melee: 1 (Spears). ** Silas and Marge Defold - This older couple keep the grain mill down by the winding stream. They mill the flour and brew beer. ** Mera Searf and Vela Tram - These two women run a wheat farm and bake bread to the west of the village. ** Thom, Janice, and Gwen Folken - A young couple with their 12 year old daughter run a small farm to the south. Thom hunts deer and rabbit which are plentiful in the nearby woods, while Janice and Gwen raise chickens. Gwen also gathers various berries and makes tasty jams. When food is sufficient, Thom with his woodsman's axe. Skills: Hunting: 1 (Snares), Ranged: 1 (Bows) * Missing Persons - Yesterday morning, the old mill was found abandoned. The miller and his wife were nowhere to be found, but some of their flour, wheat and beer were clearly dragged away, their living quarters were ransacked, and small blood stains were found. A search around the surrounding area left no clues. * Scouts - Recently a small band of [Darkling]s opened up a small ventilation tunnel from the Deep Roads. Three goblins had been scouting the area at night when they came across the mill. After some arguing, they broke in, captured the couple, searched the place for loot, and dragged away what they could. * Hidden Camp - They have a small camp hidden in the woods where they have tied up the couple and are doing their best to drink all the beer they stole and torment their prisoners. They intend to return to gather more loot. * Vent Base - Five miles away is the vent where the darklings broke through from the Deep Roads. An ambitious Hobgoblin leads the 3 Goblin Scouts, 2 Goblin Engineers, and a Bugbear Hunter. ** Goblin Engineers (Sgree, Dley) - The engineers are working to widen the vent. Body 3:1, Mind 2:1, Will 2:1 Skills: Mining (1), Melee: 1 (Picks) ** Goblin Scouts (Grot, Steg, Glel-Female) - The scouts are at the Hidden Camp. Body 3:1, Mind 2:1, Will 2:1 Skills: Scouting: 1 (Survey), Close Combat: 1 (Knives) ** Bugbear (Reegal) - The Bugbear alternates between hunting, eating, and lounging. Like the Hobgoblin, the Bugbear is most interested in his own survival. If the battle goes against them, he will just disappear into the woods. Body 2:2, Mind 3:1, Will 4:1 Skills: [Melee]: 3 [Long Spear], [Hunting]: 2 [Tracking], [Stalking], [Survival]: 2 [Find Shelter], [Live off the Land]. ** Hobgoblin (Gemste) - The Hobgoblin is very pleased with her plan to use the ventilation shaft and hopes to expand it sufficiently for a future raiding force that she hopes to lead. Though, she is a skilled fighter, she has higher ambitions than an early grave and is quick to parley if overwhelmed. Body 8:1, Mind 6:1, Will 5:1 Skills: Melee: 3 (Swords), Armor: 2 (Scale), Leadership: 2 (Command)"))
nx/tactics/books/gettingstarted / scenario-murin-a0
Description:
Constant Name:
  • scenario-murin-a0
Type:
  • nx/tactics/base/scenario
Usage/Test Cases:
Source Code:
  • (const scenario-murin-a0 : base/scenario (base/scenario :summary "* Prologue - You've been traveling for a while. Odd jobs here and there have kept you fed, but no opportunity has paid off so far. Your funds are desperately low, and you have to consider giving up a life on the road for something more stable, at least for a while. * Setting - You've ended up among the Iron Cross Mountains. This used to be territory enthusiastically protected by the Dwarves who lived below, but thing have been quiet for a few years and human civilization is tentatively spreading into the area. There are said to be numerous mines and jewels to be found in these mountains, but so far they are just stories. You are currently traveling with a couple of religious aspirants and their fanatical followers. They claim to follow the Sun God and must follow him during the day. For some reason the truly feebleminded seem to gather together. Well, even if their beliefs are nonsense, their coin is real at least. * Plot Hooks - A young man (Jos Halslef) with a mule and cart approach from ahead. His clothes are well made but worn, and he does not appear threatening. He engages the group, but soon finds conversation with the aspirants to go nowhere. He suggests coming with him to Murinton."))
nx/tactics/books/gettingstarted / scenario-murin-a1
Description:
Constant Name:
  • scenario-murin-a1
Type:
  • nx/tactics/base/scenario
Usage/Test Cases:
Source Code:
  • (const scenario-murin-a1 : base/scenario (base/scenario :summary "* Murin Vale - Murin Vale is a misty depression huddled between stout Murin-Lead Mountain and the spiky Murin-Quartz Peak. A hundred years ago, this entire area was controlled by the Murin Dwarf Clan who served the [Dwarven Underking] far down the [Deep Roads]. However, long ago, the Dwarves withdrew without explanation. Murinton, their trading village, was adopted by the human traders who no longer had their main trading partner. * Plot Hooks - A rough trail leads through the wooded vale to a small abandoned town, though smoke can be seen rising from its center."))
nx/tactics/books/gettingstarted / scenario-murin-a2
Description:
Constant Name:
  • scenario-murin-a2
Type:
  • nx/tactics/base/scenario
Usage/Test Cases:
Source Code:
  • (const scenario-murin-a2 : base/scenario (base/scenario :summary "* Murinton - Within Murin Vale, at the base of Murin-Lead Mountain is the abandoned, Dwarven village of Murinton. A small populated outpost lies at its center. The outpost is dominated by the 20ft stone doors that lead into Murin-Lead Mountain. The massive doors are carved with dwarven artwork and sealed tight from within. The only occupied buildings are a general store, a smithy, a small grain mill, and some outlying farm houses. A winding stream runs down the mountain and powers the mill. * Personalities - Only 9 people live in this town though there is probably room for a hundred. ** Jen Halslef - Jen Halslef heads the outpost, negotiates deals, and runs the smithy when needed. She founded the town 2 years ago, taking advantage of the free property and safe territory. Maintaining the town has been difficult with so little resources, so she remains concerned for the town's future. Her smithy is dedicated to the god dwarven god Moradin, and has carved tablets around the walls describing smithing and calling on the blessings of Moradin. She was facinated and has been diligently following both to improve her smithing. Unknown to her, Moradin was intrigued by a human female follower and has blessed her. Skills: Tradeskills: 1 (Smithing), Channeling: 1 (Healing). ** Jos Halslef - Jen's twin brother runs the general store, trades with other villages, and keeps the books. The twins had brought a fair quantity of goods to start the town, but after 2 years resources are getting thin. Chicken, Bread, Jam, and Beer are the staple foods in town. Jos brings a homemade short spear with him when he travels and is passable at its use. Skills: Trade: 1 (Haggling), Melee: 1 (Spears). ** Silas and Marge Defold - This older couple keep the grain mill down by the winding stream. They mill the flour and brew beer. ** Mera Searf and Vela Tram - These two women run a wheat farm and bake bread to the west of the village. ** Thom, Janice, and Gwen Folken - A young couple with their 12 year old daughter run a small farm to the south. Thom hunts deer and rabbit which are plentiful in the nearby woods, while Janice and Gwen raise chickens. Gwen also gathers various berries and makes tasty jams. When food is sufficient, Thom with his woodsman's axe. Skills: Hunting: 1 (Snares), Ranged: 1 (Bows) * Missing Persons - Yesterday morning, the old mill was found abandoned. The miller and his wife were nowhere to be found, but some of their flour, wheat and beer were clearly dragged away, their living quarters were ransacked, and small blood stains were found. A search around the surrounding area left no clues. * Scouts - Recently a small band of [Darkling]s opened up a small ventilation tunnel from the Deep Roads. Three goblins had been scouting the area at night when they came across the mill. After some arguing, they broke in, captured the couple, searched the place for loot, and dragged away what they could. * Hidden Camp - They have a small camp hidden in the woods where they have tied up the couple and are doing their best to drink all the beer they stole and torment their prisoners. They intend to return to gather more loot. * Vent Base - Five miles away is the vent where the darklings broke through from the Deep Roads. An ambitious Hobgoblin leads the 3 Goblin Scouts, 2 Goblin Engineers, and a Bugbear Hunter. ** Goblin Engineers (Sgree, Dley) - The engineers are working to widen the vent. Body 3:1, Mind 2:1, Will 2:1 Skills: Mining (1), Melee: 1 (Picks) ** Goblin Scouts (Grot, Steg, Glel-Female) - The scouts are at the Hidden Camp. Body 3:1, Mind 2:1, Will 2:1 Skills: Scouting: 1 (Survey), Close Combat: 1 (Knives) ** Bugbear (Reegal) - The Bugbear alternates between hunting, eating, and lounging. Like the Hobgoblin, the Bugbear is most interested in his own survival. If the battle goes against them, he will just disappear into the woods. Body 2:2, Mind 3:1, Will 4:1 Skills: [Melee]: 3 [Long Spear], [Hunting]: 2 [Tracking], [Stalking], [Survival]: 2 [Find Shelter], [Live off the Land]. ** Hobgoblin (Gemste) - The Hobgoblin is very pleased with her plan to use the ventilation shaft and hopes to expand it sufficiently for a future raiding force that she hopes to lead. Though, she is a skilled fighter, she has higher ambitions than an early grave and is quick to parley if overwhelmed. Body 8:1, Mind 6:1, Will 5:1 Skills: Melee: 3 (Swords), Armor: 2 (Scale), Leadership: 2 (Command)"))
nx/tactics/books/giant_monsters
Description:
Package Name:
  • nx/tactics/books/giant_monsters
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
Functions:
  • tacticsbook
Source Code:
  • (package nx/tactics/books/giant_monsters :libs (lib base :path nx/tactics/base)) (func tacticsbook : base/book (book :name "Giant Monsters" :image "GiantMonsters.jpg" :chaptermap (chaptermap :Overview (chapter :name "Overview" :sectionmap (sectionmap "Why Tactics:Giant Monsters?" (section :name "Why Tactics:Giant Monsters?"))) :Daikaiju (chapter :name "Daikaiju" :sectionmap (sectionmap "Enemy Monsters" (section :name "Enemy Monsters" :unitmap (unitmap :Battra (unit :name "Battra" :image "Daikaiju/BattraToken.png" :summary "Flight at mach 3; can travel through space; hurricane winds from wings; able to shoot Prism beams from eyes; can conduct energy through its touch" :mass "30ktons" :length "73m") "Battra, Larva" (unit :name "Battra, Larva" :image "Daikaiju/BattraLarvaeToken.png" :summary "Burrowing ability; adept swimmer; able to shoot Prism beams from horn and eyes; body can generate energy pulses to attack others with its touch" :mass "20ktons" :length "90m") :Biollante (unit :name "Biollante" :image "Daikaiju/Biollante.png") :Destroyah (unit :name "Destroyah" :image "Daikaiju/Destroyah.png") :Godzilla (unit :name "Godzilla" :image "Daikaiju/GodzillaToken.png" :summary "* Superheated atomic breath capable of devastating whole city blocks * Remarkably fast regenerative healing factor * Incredibly strong, even for his size * Able to swim at 40 knots * Though extremely powerful, possesses a few weaknesses: has an aversion to electricity, can be weakened by massive amounts of cadmium and other radiation-retardants" :mass "60ktons" :height "100m" :unitskillmap (unitskillmap "Radiation Powers" (unitskill :name "Radiation Powers" :unitabilitymap (unitabilitymap "Radiation Beam" (unitability :name "Radiation Beam") "Radiation Blast" (unitability :name "Radiation Blast"))))) :Gyaos (unit :name "Gyaos" :image "Daikaiju/GyaosToken.png" :summary "* Flight at mach 4.2 * Hurricane winds from wings * A shrill cry serves as an ultrasonic scalpel which amounts to approximately 3 million Hz, and can also cut through solid steel bards with a thickness of 30cm. * Can reproduce asexually * Gyoas easily adapts to its surroundings, growing exponentially in size. * Gyaos has one absolutely perfect pair of chromosomes. * Origin - Gyaos was the product of genetic engineering by a super-ancient civilization. * Vision - As a nocturnal creature, Gyaos avoids and dislikes light." :mass "75tons" :height "85m" :width "185m") "King Ghidorah" (unit :name "King Ghidorah" :image "Daikaiju/KingGhidorahToken.png" :summary "* Speed Mach 3 * Able to fire Gravity beams from its mouths * hurricane winds from wings * constricting necks" :mass "70ktons" :height "140m") :Legion (unit :name "Legion" :image "Daikaiju/LegionToken.png" :reference "And he asked him, What is thy name? And he answered, saying, My name is Legion: for we are many. - New Testament - Mark 5:9" :summary "* Silicone-based life form with cell structure like transistors * Joints operate by pressurized gas. * Communicates via electromagnetic waves * Launches seeds into orbit by generating a high oxygen area and then detonating it. Flight at mach 1; sharp horn, which can open to fire a beam; horn generates a tremendous amount of heat after firing; can burrow and travel, underground, at a speed of 50 kilometers an hour; able to produce up to 100 Symbiotic Legion an hour; can create a magnetic force shield to protect the front of its body using the ten smaller legs near its head; if its horn is destroyed Legion can fire off strands of energy that are able to pierce and burn objects Eye: Legion can see electro-magnetic activity. Voice: The Legion Mother's microwave blast, which eminates from her huge tusks is powerful enough to vaporize a type-90 tank with one blow. Ovaries: Legion's ovaries house a hive of countless soldiers that can be ordered to attack instantly. It is estimated that she can reproduce approximately 100 soldiers every hour. Appendages: Legion's many appendages are used in both battle and burrowing; while they quickly assist in breaking up even the toughest earth, these deadly arms were seen puncturing Gamera's shell. Armored Exoskeleton: Made of a hard silicone-like resin, Legion's exo-skeleton is not only an insulator but protects her body from attacks. Interference wave-blast: Generated in the shape of a parabola, it acts as a shield. Legion was seen disabling the automatic targeting system of missles with this abilaity." :mass "600tons" :height "140m") :Megaguirus (unit :name "Megaguirus" :image "Daikaiju/MegaguirusToken.png" :summary "Flight at mach 4; hurricane winds and sonic waves from wings; claws; stinger with the ability to drain power; claw tipped wings; able to use stinger to discharge a blast of energy comprised of its opponent's beam weapon which it absorbed; flight causes electronic disturbances" :mass "12ktons" :length "50m"))))) "Giant Robots" (chapter :name "Giant Robots" :sectionmap (sectionmap "Allied Robots" (section :name "Allied Robots" :unitmap (unitmap "Getter 1" (unit :name "Getter 1" :image "Daikaiju/Getter_1.png" :summary "* Swimming: 18knots * Flight: Mach 2" :speed "420kph" :mass "220tons" :height "38m" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee" :summary "* Getter Tomahawk" :level "5") :Gunnery (unitskill :name "Gunnery" :summary "* Getter Beam * Tomahawk Boomerang" :level "5"))) "Getter 2" (unit :name "Getter 2" :image "Daikaiju/Getter_2.png" :summary "* Swimming: 18knots * Ground Speed: Mach 3! * Tunnelling: 300kph" :speed "420kph" :mass "220tons" :height "38m" :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :summary "* Getter Drill * Drill Missile" :level "5"))) "Getter 3" (unit :name "Getter 3" :image "Daikaiju/Getter_3.png" :summary "* Swimming: 28knots * Flight: Mach 3" :speed "150kph" :mass "220tons" :height "20m" :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :summary "* Getter Missile" :level "5"))) "Getter G Dragon" (unit :name "Getter G Dragon" :image "Daikaiju/GetterG_Dragon.png" :summary "* Flight: Mach 3.5" :mass "330tons" :height "50m" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee" :summary "* Double Tomahawk" :level "5") :Gunnery (unitskill :name "Gunnery" :summary "* Getter Beam * Double Tomahawk Boomerang" :level "5"))) "Getter G Liger" (unit :name "Getter G Liger" :image "Daikaiju/GetterG_Liger.png" :summary "* Swimming: 18knots * Flight: Mach 2 * Ground Speed: Mach 3! * Tunnelling: 800kph" :mass "330tons" :height "50m" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee" :summary "* Drill Arm" :level "5") :Gunnery (unitskill :name "Gunnery" :summary "* Liger Missile" :level "5"))) "Getter G Poseidon" (unit :name "Getter G Poseidon" :image "Daikaiju/GetterG_Poseidon.png" :mass "330tons" :height "40m" :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :summary "* Finger Net * Strong Missile * Getter Cyclone" :level "5"))) "Great Mazinger" (unit :name "Great Mazinger" :image "Daikaiju/GreatMazinger.png" :summary "* Swimming: 25knots * Flight: Mach 4 (Mach 5 w/Great Booster) * Ceiling: 50km * Jump: 30m * Dive Depth: 8km" :speed "450kph" :mass "32tons" :height "25m" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee" :summary "* Mazinger Blade" :level "5") :Gunnery (unitskill :name "Gunnery" :summary "* Navel Missile * Atomic Punch * Great Boomerang * Scramble Cutter - Attack with Great Booster * Great Typhoon * Breast Burn * Thunder Break" :level "5"))) :Grendizer (unit :name "Grendizer" :image "Daikaiju/Grendizer.png") "Mazinger Z" (unit :name "Mazinger Z" :image "Daikaiju/MazingerZ.png" :summary "* Swimming: 20knots * Flight: Mach 3 w/Jet Scrander" :speed "360kph" :mass "20tons" :height "18m" :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :summary "Koushiryoku Beam Mazinger Z can channel pure Photonic Energy through its eyes, unleashing a pair of powerful lasers, which are said to be equal to 10 tons of explosives. This was originally considered Mazinger Z's weakest attack, however, in Shin Mazinger the power of this attacked is greatly magnified to the point where it can now be considered the strongest. Missile Punch Mazinger Z mounts a missile launch bay in its belly, which can store several missiles. Rocket Punch Mazinger Z's eponymous attack; it fires off its forearm like a missile, punching straight through an enemy before returning and docking with the elbow again. Rust Hurricane The powerful turbines in Mazinger Z's head create gale-force winds, launching them through the mouth grill. The attack includes highly corrosive particles (thought to be ionized hydrogen), almost instantaneously causing an enemy to rust over and fall apart. Breast Fire The large red fins on Mazinger Z's chest act as heat sinks for its Photonic Energy reactor. Mazinger Z can fire off this stored thermal energy as a powerful, 30,000 degree white-hot beam that melts almost anything. In the Super Robot Wars series, Kouji and Tetsuya Tsurugi can use the Breast Fire and Breast Burn respectively in the Double Burning Fire attack, which they use in the MX version of the Final Dynamic Special (also involving Grendizer and a Getter). Kyoukagata Rocket Punch Mazinger Z's Rocket Punch was later reinforced with stronger armor, giving it a more powerful punch. Iron Cutter An improved Rocket Punch in which the forearm sprouts a pair of axe-like blades, allowing it to cut and slash as well as bludgeon. This is the only weapon in Mazinger Z:s arsenal which can damage Super-alloy Z. Drill Missile A barrage of small, needle-like missiles fired from ports in Mazinger's upper arms. This attack was typically performed after the Rocket Punch but before the forearm had returned. Daisharin Rocket Punch Mazinger Z spins its arms rapidly, building up momentum before firing off both fists in standard Rocket Punch fashion. Reitou Beam Mazinger unleashes a blast of intense cold; this attack was alternately fired from the mouth grill or the spikes on the sides of Mazinger's head. Finger Missile A rarely-used attack where Mazinger fires the last joint of its fingers as miniature missiles." :level "5"))) :Raideen (unit :name "Raideen" :image "Daikaiju/Raideen.png" :summary "Flight: Mach 10 in God Bird form" :mass "350tons" :height "52m" :unitskillmap (unitskillmap :Armor (unitskill :name "Armor" :summary "* God Block") :Melee (unitskill :name "Melee" :summary "* God Breaker" :level "5") :Gunnery (unitskill :name "Gunnery" :summary "* God Missile * God Arrow" :level "5"))) :Voltron (unit :name "Voltron" :image "Daikaiju/Voltron.png" :mass "700tons" :height "60m" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee" :summary "* Blazing Sword - Ten Kings Sword" :level "5") :Gunnery (unitskill :name "Gunnery" :summary "* Wing Boomerang - Boomerang attack from the wings of GoLion. * Space Cutter - Spinning Blades. * Eye Flash - Beams fired from the eyes of GoLion. * Hurricane Attack - Wind attack similar to Daimos Blizzard, but not as strong. * Laser Magnum - Laser-like bullets fired from the mouth of the Green Lion. * Fire Tornado - A burst of flame emits from the mouth of the Red Lion. * Cross Beam - Cross-shaped boomerang fired from the chest. * Gatling Missiles - Small missiles fired from the legs. * Electromagnetic Lance - Weapon used as a spear at times. * Foot Missile - Missiles fired from the mouths of the Blue and Yellow Lions. * Four Lion Attack - The 'Lion Head Attack' 100-Ton Punch. * Grand Fire - A stream of flames fired from the mouths of the Blue and Yellow Lions" :level "5"))))))))))
nx/tactics/books/giant_monsters / tacticsbook
Description:
Function Name:
  • tacticsbook
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func tacticsbook : base/book (book :name "Giant Monsters" :image "GiantMonsters.jpg" :chaptermap (chaptermap :Overview (chapter :name "Overview" :sectionmap (sectionmap "Why Tactics:Giant Monsters?" (section :name "Why Tactics:Giant Monsters?"))) :Daikaiju (chapter :name "Daikaiju" :sectionmap (sectionmap "Enemy Monsters" (section :name "Enemy Monsters" :unitmap (unitmap :Battra (unit :name "Battra" :image "Daikaiju/BattraToken.png" :summary "Flight at mach 3; can travel through space; hurricane winds from wings; able to shoot Prism beams from eyes; can conduct energy through its touch" :mass "30ktons" :length "73m") "Battra, Larva" (unit :name "Battra, Larva" :image "Daikaiju/BattraLarvaeToken.png" :summary "Burrowing ability; adept swimmer; able to shoot Prism beams from horn and eyes; body can generate energy pulses to attack others with its touch" :mass "20ktons" :length "90m") :Biollante (unit :name "Biollante" :image "Daikaiju/Biollante.png") :Destroyah (unit :name "Destroyah" :image "Daikaiju/Destroyah.png") :Godzilla (unit :name "Godzilla" :image "Daikaiju/GodzillaToken.png" :summary "* Superheated atomic breath capable of devastating whole city blocks * Remarkably fast regenerative healing factor * Incredibly strong, even for his size * Able to swim at 40 knots * Though extremely powerful, possesses a few weaknesses: has an aversion to electricity, can be weakened by massive amounts of cadmium and other radiation-retardants" :mass "60ktons" :height "100m" :unitskillmap (unitskillmap "Radiation Powers" (unitskill :name "Radiation Powers" :unitabilitymap (unitabilitymap "Radiation Beam" (unitability :name "Radiation Beam") "Radiation Blast" (unitability :name "Radiation Blast"))))) :Gyaos (unit :name "Gyaos" :image "Daikaiju/GyaosToken.png" :summary "* Flight at mach 4.2 * Hurricane winds from wings * A shrill cry serves as an ultrasonic scalpel which amounts to approximately 3 million Hz, and can also cut through solid steel bards with a thickness of 30cm. * Can reproduce asexually * Gyoas easily adapts to its surroundings, growing exponentially in size. * Gyaos has one absolutely perfect pair of chromosomes. * Origin - Gyaos was the product of genetic engineering by a super-ancient civilization. * Vision - As a nocturnal creature, Gyaos avoids and dislikes light." :mass "75tons" :height "85m" :width "185m") "King Ghidorah" (unit :name "King Ghidorah" :image "Daikaiju/KingGhidorahToken.png" :summary "* Speed Mach 3 * Able to fire Gravity beams from its mouths * hurricane winds from wings * constricting necks" :mass "70ktons" :height "140m") :Legion (unit :name "Legion" :image "Daikaiju/LegionToken.png" :reference "And he asked him, What is thy name? And he answered, saying, My name is Legion: for we are many. - New Testament - Mark 5:9" :summary "* Silicone-based life form with cell structure like transistors * Joints operate by pressurized gas. * Communicates via electromagnetic waves * Launches seeds into orbit by generating a high oxygen area and then detonating it. Flight at mach 1; sharp horn, which can open to fire a beam; horn generates a tremendous amount of heat after firing; can burrow and travel, underground, at a speed of 50 kilometers an hour; able to produce up to 100 Symbiotic Legion an hour; can create a magnetic force shield to protect the front of its body using the ten smaller legs near its head; if its horn is destroyed Legion can fire off strands of energy that are able to pierce and burn objects Eye: Legion can see electro-magnetic activity. Voice: The Legion Mother's microwave blast, which eminates from her huge tusks is powerful enough to vaporize a type-90 tank with one blow. Ovaries: Legion's ovaries house a hive of countless soldiers that can be ordered to attack instantly. It is estimated that she can reproduce approximately 100 soldiers every hour. Appendages: Legion's many appendages are used in both battle and burrowing; while they quickly assist in breaking up even the toughest earth, these deadly arms were seen puncturing Gamera's shell. Armored Exoskeleton: Made of a hard silicone-like resin, Legion's exo-skeleton is not only an insulator but protects her body from attacks. Interference wave-blast: Generated in the shape of a parabola, it acts as a shield. Legion was seen disabling the automatic targeting system of missles with this abilaity." :mass "600tons" :height "140m") :Megaguirus (unit :name "Megaguirus" :image "Daikaiju/MegaguirusToken.png" :summary "Flight at mach 4; hurricane winds and sonic waves from wings; claws; stinger with the ability to drain power; claw tipped wings; able to use stinger to discharge a blast of energy comprised of its opponent's beam weapon which it absorbed; flight causes electronic disturbances" :mass "12ktons" :length "50m"))))) "Giant Robots" (chapter :name "Giant Robots" :sectionmap (sectionmap "Allied Robots" (section :name "Allied Robots" :unitmap (unitmap "Getter 1" (unit :name "Getter 1" :image "Daikaiju/Getter_1.png" :summary "* Swimming: 18knots * Flight: Mach 2" :speed "420kph" :mass "220tons" :height "38m" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee" :summary "* Getter Tomahawk" :level "5") :Gunnery (unitskill :name "Gunnery" :summary "* Getter Beam * Tomahawk Boomerang" :level "5"))) "Getter 2" (unit :name "Getter 2" :image "Daikaiju/Getter_2.png" :summary "* Swimming: 18knots * Ground Speed: Mach 3! * Tunnelling: 300kph" :speed "420kph" :mass "220tons" :height "38m" :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :summary "* Getter Drill * Drill Missile" :level "5"))) "Getter 3" (unit :name "Getter 3" :image "Daikaiju/Getter_3.png" :summary "* Swimming: 28knots * Flight: Mach 3" :speed "150kph" :mass "220tons" :height "20m" :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :summary "* Getter Missile" :level "5"))) "Getter G Dragon" (unit :name "Getter G Dragon" :image "Daikaiju/GetterG_Dragon.png" :summary "* Flight: Mach 3.5" :mass "330tons" :height "50m" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee" :summary "* Double Tomahawk" :level "5") :Gunnery (unitskill :name "Gunnery" :summary "* Getter Beam * Double Tomahawk Boomerang" :level "5"))) "Getter G Liger" (unit :name "Getter G Liger" :image "Daikaiju/GetterG_Liger.png" :summary "* Swimming: 18knots * Flight: Mach 2 * Ground Speed: Mach 3! * Tunnelling: 800kph" :mass "330tons" :height "50m" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee" :summary "* Drill Arm" :level "5") :Gunnery (unitskill :name "Gunnery" :summary "* Liger Missile" :level "5"))) "Getter G Poseidon" (unit :name "Getter G Poseidon" :image "Daikaiju/GetterG_Poseidon.png" :mass "330tons" :height "40m" :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :summary "* Finger Net * Strong Missile * Getter Cyclone" :level "5"))) "Great Mazinger" (unit :name "Great Mazinger" :image "Daikaiju/GreatMazinger.png" :summary "* Swimming: 25knots * Flight: Mach 4 (Mach 5 w/Great Booster) * Ceiling: 50km * Jump: 30m * Dive Depth: 8km" :speed "450kph" :mass "32tons" :height "25m" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee" :summary "* Mazinger Blade" :level "5") :Gunnery (unitskill :name "Gunnery" :summary "* Navel Missile * Atomic Punch * Great Boomerang * Scramble Cutter - Attack with Great Booster * Great Typhoon * Breast Burn * Thunder Break" :level "5"))) :Grendizer (unit :name "Grendizer" :image "Daikaiju/Grendizer.png") "Mazinger Z" (unit :name "Mazinger Z" :image "Daikaiju/MazingerZ.png" :summary "* Swimming: 20knots * Flight: Mach 3 w/Jet Scrander" :speed "360kph" :mass "20tons" :height "18m" :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :summary "Koushiryoku Beam Mazinger Z can channel pure Photonic Energy through its eyes, unleashing a pair of powerful lasers, which are said to be equal to 10 tons of explosives. This was originally considered Mazinger Z's weakest attack, however, in Shin Mazinger the power of this attacked is greatly magnified to the point where it can now be considered the strongest. Missile Punch Mazinger Z mounts a missile launch bay in its belly, which can store several missiles. Rocket Punch Mazinger Z's eponymous attack; it fires off its forearm like a missile, punching straight through an enemy before returning and docking with the elbow again. Rust Hurricane The powerful turbines in Mazinger Z's head create gale-force winds, launching them through the mouth grill. The attack includes highly corrosive particles (thought to be ionized hydrogen), almost instantaneously causing an enemy to rust over and fall apart. Breast Fire The large red fins on Mazinger Z's chest act as heat sinks for its Photonic Energy reactor. Mazinger Z can fire off this stored thermal energy as a powerful, 30,000 degree white-hot beam that melts almost anything. In the Super Robot Wars series, Kouji and Tetsuya Tsurugi can use the Breast Fire and Breast Burn respectively in the Double Burning Fire attack, which they use in the MX version of the Final Dynamic Special (also involving Grendizer and a Getter). Kyoukagata Rocket Punch Mazinger Z's Rocket Punch was later reinforced with stronger armor, giving it a more powerful punch. Iron Cutter An improved Rocket Punch in which the forearm sprouts a pair of axe-like blades, allowing it to cut and slash as well as bludgeon. This is the only weapon in Mazinger Z:s arsenal which can damage Super-alloy Z. Drill Missile A barrage of small, needle-like missiles fired from ports in Mazinger's upper arms. This attack was typically performed after the Rocket Punch but before the forearm had returned. Daisharin Rocket Punch Mazinger Z spins its arms rapidly, building up momentum before firing off both fists in standard Rocket Punch fashion. Reitou Beam Mazinger unleashes a blast of intense cold; this attack was alternately fired from the mouth grill or the spikes on the sides of Mazinger's head. Finger Missile A rarely-used attack where Mazinger fires the last joint of its fingers as miniature missiles." :level "5"))) :Raideen (unit :name "Raideen" :image "Daikaiju/Raideen.png" :summary "Flight: Mach 10 in God Bird form" :mass "350tons" :height "52m" :unitskillmap (unitskillmap :Armor (unitskill :name "Armor" :summary "* God Block") :Melee (unitskill :name "Melee" :summary "* God Breaker" :level "5") :Gunnery (unitskill :name "Gunnery" :summary "* God Missile * God Arrow" :level "5"))) :Voltron (unit :name "Voltron" :image "Daikaiju/Voltron.png" :mass "700tons" :height "60m" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee" :summary "* Blazing Sword - Ten Kings Sword" :level "5") :Gunnery (unitskill :name "Gunnery" :summary "* Wing Boomerang - Boomerang attack from the wings of GoLion. * Space Cutter - Spinning Blades. * Eye Flash - Beams fired from the eyes of GoLion. * Hurricane Attack - Wind attack similar to Daimos Blizzard, but not as strong. * Laser Magnum - Laser-like bullets fired from the mouth of the Green Lion. * Fire Tornado - A burst of flame emits from the mouth of the Red Lion. * Cross Beam - Cross-shaped boomerang fired from the chest. * Gatling Missiles - Small missiles fired from the legs. * Electromagnetic Lance - Weapon used as a spear at times. * Foot Missile - Missiles fired from the mouths of the Blue and Yellow Lions. * Four Lion Attack - The 'Lion Head Attack' 100-Ton Punch. * Grand Fire - A stream of flames fired from the mouths of the Blue and Yellow Lions" :level "5"))))))))))
nx/tactics/books/horror
Description:
Package Name:
  • nx/tactics/books/horror
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
Functions:
  • tacticsbook
Source Code:
  • (package nx/tactics/books/horror :libs (lib base :path nx/tactics/base)) (func tacticsbook : base/book (book :name "Horror" :image "Cthulhu.jpg" :chaptermap (chaptermap "Horror Overview" (chapter :name "Horror Overview" :sectionmap (sectionmap "Why Tactics: Horror?" (section :name "Why Tactics: Horror?"))) "Call of Cthulhu" (chapter :name "Call of Cthulhu" :reference "* Premise that common human laws and interests and emotions have no validity or significance in the vast cosmos-at-large... To achieve the essence of real externality, whether of space or time or dimension, one must forget that such things as organic life, good and evil, love and hate, and all such local attributes of a negligible and temporary race called mankind, have any existence at all." :summary "* Most of the intelligent Mythos creatures are masters of [Necromancy] and have long ago reanimated their physical bodies into part physical/part spiritual forms that humans would call [Undead]. * Like [Undead], they exist partially in the [Spirit Realm], are immune to most hostile environments, and appear blurry in photograph and other recordings. * If their body is destroyed, their Spirit leaves the body and enters the [Spirit Realm] fully. Their bodies age will rapidly catch up to it usually causing it to deteriorate rapidly. Normally their spirit never returns to the physical world, but if they are powerful enough, they may find their way back through the Veil and even death may not stop them from returning." :sectionmap (sectionmap "Seeds of Azathoth" (section :name "Seeds of Azathoth" :summary "* Nemesis - Since 1984, a theory attempts to explain the mass extinctions that occur every 27 million years. The theory submits that a brown dwarf star orbits our sun at 95,000 AUs and every 27 million years it approaches close enough to rain comets throughout the solar system causing climate change, mass-extinctions, and similar catastrophes. * Seeds of Azathoth - Nemesis is, in reality, a Spawn of Azathoth that has clung to orbit around the Sun. Occasionally, pieces of Nemesis break free, falling into the solar system: the Seeds of Azathoth. Seeds that strike the Sun are destroyed, but if a seed strikes a planet, it can melt into the planet's core where it grows immensely, eventually forming a new Spawn which emerges from the broken planet like a snake from an egg. Our system's original fifth world was so parasitized. Its remnants compose the asteroid belt. * For millenia, human and other astronomers have seen in comets, 'hairy stars', approaching disaster and ill-fortune. In ancient texts, comets have been blamed for the revolt of the Shoggoths against the Elder Things, the doom of the dinosaurs, the fall of the empire of the Serpent People, the destruction of Hyperborea, the sinking of Atlantis, and even the two ages of chaos that struck early Egypt. * The most recent effect of Nemesis took place in central Siberia, June 30, 1908, when a tremendous explosion rocked the area for hundreds of miles. There was a pillar of fire and shock waves powerful enough to knock down horses 400 miles away." :sectionmap (sectionmap "The Case of Phillip Baxter" (section :name "The Case of Phillip Baxter" :scenariomap (scenariomap "Figure in the Night" (scenario :name "Figure in the Night" :summary "* An investigator wakes suddenly in the night to see the room bathed in pale green light and a strange musky smell. A vague, ghostly figure gestures toward the investigator. Suddenly, a portion of its head disappears as if bitten off. The spectre stumbles and thrashes around the room as more of the head is eaten until it is completely headless. The figure goes rigid and fades away leaving the room in darkness. * After contemplation, the figure is recognized as Professor Phillip Baxter a former teacher of the investigator. * Contacting Phillip's home gets the distraught housekeeper, Angela Vincenzo. She informs them that Phillip passed away yesterday of a sudden illness. She invites them to the funeral the next morning. * A successful Occult roll indicates that an apparition usually appears at the moment of death instead of a day later.") "Funeral of Phillip Baxter" (scenario :name "Funeral of Phillip Baxter" :summary "The services are in the rain and attended by: * Julian Baxter, the priest, in a wheelchair. * Matthew, the priest's personal attendant, who is a large, silent man. * Emmott Baxter, elder son of the deceased. * Dr. Douglas Walters, the family physician. * Silas Patterson, anthropologist and member of the Tuesday Night Academy. * Judge Braddock, executor of the estate. * Angela, the housekeeper. * Alvin Beswick, undertaker and hearse driver.") "Legacy of Phillip Baxter" (scenario :name "Legacy of Phillip Baxter" :summary "* Angela receives the property * Half of his cash goes to the Tuesday Night Academy * The remaining half goes to his three children Emmott, Colin, and Cynthia. Cynthia's portion to be donated to the Catholic Widow's Relief Fund as she requested. * At this, Emmott accuses Silas Patterson and his Tuesday Night Academy of wasting all his father's money in life and now in death. * Finally, a packet of papers is given to the investigators according to the will. This packet contains Phillip's dream journal and an short note about why he thought the investigators might be interested.") "Dream Journal of Phillip Baxter" (scenario :name "Dream Journal of Phillip Baxter" :summary "* The enclosed note describes that his dreams had become more vivid and recurring recently and that he felt that he needed to write them down and give them to someone who might find the account scientifically interesting. * He had traveled to Ultar and visited the library there. In the library, he found the book, the [Cthaat Aquadingen] which gave important insight into his current research. As Phillip left the library, he saw an evil-looking dwarf that he had seen in a carnival he passed on the way into the city. The dwarf was discretely following him. Phillip managed to shake him before he woke up. * Anyone experienced in the Dreamlands will recognize the entrance to the Dreamlands and Ultar.") "Home of Phillip Baxter" (scenario :name "Home of Phillip Baxter" :summary "* Angela Vincenzo, the former housekeeper is now the only resident in the roomy three bedroom home. * The study contains various paperwork including: ** A letter from Phillip's daughter Cynthia describing that her supposed kidnapping by natives was not as serious as he was led to believe and that she is perfectly fine. She has sent a box of coconuts as a present. ** Notes on the Tuesday Night Academy's purchase of a large telescope and their search for a 'Dark Star' called Nemesis. ** An anthropology book authored by Silas Patterson with marked section describing southeast Indian tribes displaying remnants of ritual cannibalism. Most are symbolic acts upon the death of a family member or friend, but on occasion the ritual is actually performed using a monkey or ape substitued for a human. Of particular interest is a brain eating custom where the brain is exposed and eaten directly from the skull while still warm. An elderly native said that he had seen apes killing smaller monkeys and eating their brains in similar manner. ** A diary including comments about: *** His brother Julian sudden sickness and retirement after returning from the Andaman Islands. *** Julian's subsequent suicide attempt *** Cynthia's trip to the Andaman Islands and subsequent abduction by savages. *** Her later release *** Arguments with his sons over favoritism *** His recent series of nightmares *** His therapy with Julian over his nightmares and the drug Julian prepared to help him sleep. *** The ultra-realistic new dreams after the drug put him into an especially deep sleep. *** Julian's refusal to provide more of the drug. *** Phillip's break-in of Julian's house and the successful theft of the drug. * The basement contains an unopened crate of coconuts with a small hole chewed through the side. * The attic contains a formerly extinct prehistoric spider that was in the crate of coconuts. It had bitten Phillip in his sleep and put him into a deep coma that was mistaken for death. The spider venom causes unconsciousness in 10 minutes, but the victim will revive on its own within two days."))) "Search for the Seed" (section :name "Search for the Seed" :scenariomap (scenariomap "The Garrison Observatory" (scenario :name "The Garrison Observatory" :summary "* The Tuesday Night Academy has spent a large sum of money to erect an observatory in Garrison Montana. They experiment with prisms to try to detect the dark star that their research claims has had a sweeping effect on history. * The Observatory is deep in the woods and is only accessible on horseback.") "The Defenders of the Seed" (scenario :name "The Defenders of the Seed" :summary "* The Seed - A Seed of Azathoth has been hurtling through space for centuries and has finally been drawn to Earth. As it approached, the special prisms in the telescope attracted it like sunlight off a mirror. The Seed swept across the sky and crashed in the woods. Its strange green fire trail attracted the attention of many including those at the observatory and a group of local hunters. * Sasquatch - When the hunters found and examined the asteroid, they were exposed to the horrific radiations of the Seed. Those that survived, regressed to a primitive state. They are terrified by the Seed, but are compulsively drawn to it. They have buried the Seed in an alcove of the cave in which they live. The Seed is slowly killing them, and as they die, they dissolve into a primordial soup before actually dying. * Sylvian Englund - Sylvia is a pleasant woman in her late sixties who lives off the land in the woods since the death of her husband. She has recently discovered the regressed hunters and believes that they are Sasquatch. She has been feeding them and has gained their trust. She enjoys her discovery and does not want outsiders to ruin her friendship with the sasquatch.") "The Race for the Seed" (scenario :name "The Race for the Seed" :summary "* Fungi From Yuggoth - A team of four Mi-go have observed the Seed's landing from their underground outpost on the Moon. Their goal is to retrieve the Seed to use as an magical energy source. Interesting humans captured along the way are to be de-brained and the brains carried back in cylinders for questioning later. * They each carry a machine that looks like a silver whorl. It fires a beam of deadly radiance that eats blackening holes in whatever it touches. Any damage prevented by armor is instead applied against the armor itself. The weapons have 37 charges and may not be recharged. The weapons have no range limitations and are excellent sniper weapons. * Their first target is the firetower where they slay Ranger Marshall and use the tower as a base of operations. * The next day they spray a nervous tissue solvent in the direct vicinity of the firetower to prevent intrusions. The spray forms a low fog that short circuits animal nervous systems driving them mad. A Grizzley Bear and Jules, Sylvia Englund's dog, are the first victims of the gas. Both roam the countryside acting randomly. * Later the same day, the Fungi search the observatory, leaving many tell-tale signs. * The next day, they capture Sylvia Englund near her ranch. They de-brain her and hide the body in the house. * Toward the end of the day, they move on the Seed. They make quick work of the hunters defending it. They carefully put the seed in a shielded container and fly it to the firetower. They gather their belongings, including the Seed and any captured brains, drop a bomb on the firetower to destroy any evidence, and fly back to the Moon."))) "Death in St. Augustine" (section :name "Death in St. Augustine" :scenariomap (scenariomap "Investigating Colin Baxter" (scenario :name "Investigating Colin Baxter" :summary "* Colin Baxter, Phillip's youngest child, is due a healthy piece of Phillip's estate, but he must be located first. His last known location was St. Augstine, Florida. Judge Braddock is concerned with the series of bizarre occurences and hires the investigators to track Colin down and check on his safety. * St. Augustine is a city in northeast Florida and the oldest continuously occupied European-established settlement in the continental United States. * Colin is indeed still here, but he has fallen on hard times and turned to alcohol. He can be found in a local speakeasy hidden behind a grocery store. * Harry Spitz - The grocery store/speakeasy is owned by Harry Spitz who runs the bar. He pays protection money to the police and is in no danger of police action. * Billy Wolff - Billy is a close friend of Colin's and will steadfastly defend his buddy in all circumstances, especially when drinking. * Esmerelda - Esmerelda is a Cuban born, hot-headed friend of Colin's. She is an illegal immigrant and will not reveal her last name under any circumstances to, somehow, protect her family.") "Colin's Treasure" (scenario :name "Colin's Treasure" :summary "* Colin has a history of get rich quick schemes and his current one is to find a fortune in sunken treasure. Unfortunately, his business partner ran away taking their remaining cash and Colin's girlfriend with him. Since then, Colin has been drinking his troubles away. * The inheritance money helps, but Colin is still short $2,000. He will offer the characters 50% of the profits if they chip in the money. * He believes that the wreck of the treasure galleon, La Rosaria can be found off Bimini. He claims to have an accurate map to the location. His map is hand copied from an original kept in the library of the 200 year old Spanish church. * Father Garcia - At the church they meet Father Garcia who is a friend of Esmerelda. Father Garcia is friendly but guarded. With the help of Esmerelda he admits that he fears that someone is watching him. He also admits to seeing figures moving in the dark on the church grounds, though he feels he must be imagining things. After gaining his trust, Father Garcia shares the church library. Though Colin's research is shoddy, futher research supports his findings that the map is an authentic map of the location of the La Rosaria.") "Colin's Wreck" (scenario :name "Colin's Wreck" :summary "* The Palencia - Colin invites the party aboard the old steamer he has bought and retrofitted for large scale salvage. The crew is mostly Cubans and blacks. As they depart, someone spots a reflection from the coast. Using binoculars, they see someone observing them back with binoculars before the person ducks away. * The Voyage - The map shows a location off Bimini, 300 miles south of St. Augustine. The voyage takes less than 24 hours on calm seas. * Diving - The diving pumps have enough pressure for no more than 2 divers at once. Wolff operates the pumps. Colin would prefer to dive with a partner and asks for volunteers. The divers reach the bottom in 2 minutes and tug twice on the line to indicate they are at bottom. The water is particularly clear and well illuminated by sunlight. Only 20 minutes later they spot the wreck and tug twice again. The divers return to the surface and describe that the wreck is in only 50 feet of water but is stuck on a reef hanging over a sharp drop off on one side. * Coral Outcropping - A protruding coral outcropping has pierced the hold of the hull. Anyone exploring this area will be the victim of a single sudden attack by the [Moray Eel] that makes its home here. The attack is not life threatening, but if the person bleeds the divers will have to return to the surface for fear of attracting sharks. * The Drop Off - Anyone foolish enough to explore the deck near the drop off, suddenly causes a section of the hull to break off and fall into the drop off. The falling diver can attempt to jump free, failing that he can scramble to grab the coral reef as he falls, otherwise he slowly falls 30 feet before the coral cuts his air hose and he drowns. The boat pulls him up, but it will be too late to save him unless he is extremely accomplished at holding his breath. * Captain's Cabin - Colin is most interested in the Captain's cabin where he finds a heavy lock box which needs to be winched to the surface. In it there can be found 22 forty pound silver bars worth $10000 total and a strange, large necklace. The necklace is carved with strange figures of animalistic humans celebrating a great comet with a tail that goes on forever. After a few days investigation, it is clear that the wreck does not contain the riches that Colin hoped for. Colin will be left deeply in debt. However, any characters who invested will double their investment.") "Colin's Ruins" (scenario :name "Colin's Ruins" :summary "* The Ruins - Colin desperately hopes that the treasure fell from the wreck before it landed at the bottom and begins retracing the ship's path. About a 300 yards away, he discovers what probably sank the La Rosaia: a sunken ruin whose stone ceiling lies just below the water line. No treasure is found, but Colin is desperate to find anything of value, so he moves to explore the Ruins. * Temple - The ruin is a stone temple in a bowl shaped depression with curved steps going down 20 feet before entering an archway. The temple itself is only 30 feet across and has many crabs and octopi. The walls are covered by mosaic tile that depicts people suffering during multiple terrible disasters. Above each disaster are tiles depicting an orb with a shining light nearby. * The Pit - In the center of the temple is a dark pit of indeterminate depth. Before the pit is a metal orb on a stone slab. The orb has a metal rod projecting from one side at the end of which is a shiny topaz. The rod can orbit the orb and telescope in or out, but its current position is very close to the orb. A mechanism inside the orb operates the rod and is apparently still active. The pit reaches about 100 feet before a rock cave-in blocks the way. Within the pit is a single, strange dolphin. * The Dolphin - If multiple lights are shined down the pit, a motionless dolphin can be seen. Suddenly, the normally peaceful dolphin swims up and attempts to ram people with incredible force. It will continue attacking unless the invaders leave or it is killed.") "Death of the Father" (scenario :name "Death of the Father" :summary "* Homecoming - As the Palencia arrives at port, police can be seen on the docks. When the Palencia docks, officers rush on board and arrest Colin and Wolff for the murder of Father Garcia. * Murder - Father Garcia was murdered the same day that Colin and the investigators went to the library. Witnesses say that Colin and Wolff returned drunk later that night and ransacked the library. That morning the priest was found in the church with his skull crushed. The reality is that the ghoul cult has been robbing graves for years. Father Garcia has been noticing activity in the night and has been hiding in the church at night to try to catch someone in the act. Unfortunately, he found the graverobbers and confronted them. They immediately killed him and called the Detective to cover up the murder. What the killers did not realize was that Esmerelda was coming home from the speakeasy when she heard a commotion from the church. She rushed over and observed the killers discussing what to do with the Father's body. * Detective Morris Packard - The detective is the head of the police force while the chief is on extended medical leave. He is also a member of a secret death cult that worships ghouls. His cult was graverobbing for their riturals when the Father caught them and he was dispensed with. Colin's drinking made him a convenient scapegoat, so the Detective is constructing circumstantial evidence to arrest Colin. Later he will arrange for Colin to hang himself in jail. If the investigators get too close to the cult, he will arrange an ambush to eliminate them. * Esmerelda - Esmerelda is conspicuously missing. After witnessing the murder scene, she packed her things and fled to her parents house in Clearwater. She fears for her safety and doesn't want to get involved, but when she iscovers that Colin has been frames, she writes a letter with what she saw to the investigators and Colin. * Crime Scene - Trampled in the dirt can be found a pin from the local alligator farm that was dropped in the scuffle. * St. Augustine Library - The local library carries copies of newspapers. Several stories can be found in the Jacksonville Sentinel that may be relevant. Older material is harder to discover. ** 1571 - A yellowed document in Spanish written by Father Rolando Tortulla of Toledo Spain. The document reports to the King, the state of the French heretics held prisoner in vaults below the monastery. They are wild and degenerate and are guilty of cannibalism. They will be held until they die. ** 1641 - A yellowed document in Spanish describes the construction of the Castillo de San Marcos that incorporates the catacombs of the old monastery. A violent french prisoner was transferred to a new cell. ** 1662 - A yellowed document in Spanish describes the horrid state of the French prisoner. His toes are missing and he limps around his cell scratching on the walls saying only gibberish. He will be held until he perishes. ** 1682 - A yellowed document in Spanish describes the escape of the french prisoner. Stones were removed from the wall of the cell and the prisoner fled into a tiny tunnel behind the wall. After a brief attempt to locate him, the tunnel was filled, sealing the fate of the horrible prisoner. Drawings were scratched into the ceiling showing comets and fire raining from the sky. ** 1792 - A religious paphlet describes an ancient evil unloosed by Satan. They are inhuman but walk among us like men. Many officials of the city, both past and present, belong to this secret, godless faith. ** February 1890 - A freshly buried body was stolen from a cemetary south of St. Augustine. No suspects were found. ** May 1927 - Grisly Find at Alligator Farm. Eli Simpson, an employee of the farm, saw a shoe in the large crocodile pool which turned out to also contain a severed human foot. No identification was found, and police theorize that a vagrant snuck onto the farm and fell into the pool. No charges were filed. ** October 1920 - A recently buried body of an indigent was stolen from the old St. Augustine church graveyard. No motive or suspects were found. * St. Augustine Herald - The local paper is a weekly that promotes local businesses and tourist trade. The editor/owner is Fred Boswell who bought the paper 3 years ago. Strangely, the original owners destroyed all their files before they left. * Jacksonville Sentinel - Sold next to the Herald is a real paper published in Jacksonville, a 2 hour drive up the coast.") "Korsky's Alligator Farm" (scenario :name "Korsky's Alligator Farm" :summary "* Eli Simpson - Eli found the severed foot and was subsequently fired by Maynard Korsky for alerting the police before discussing it with him first. It was not the only time he found strange meat in the pens, but it was the only thing he could clearly identify. * Maynard Korsky, Dell Korsky, and Kenny Durham run the farm. They use the gators to destroy the leftovers of the cult, but do not do any other cult business at the farm. * The Farm - If the investigators investigate the farm during the day, the Korskys and Kenny Durham are no help and the cult is alerted to their investigation. If they investigate at night, the farm is not guarded, but the gators have destroyed any evidence that might have been found.") "Castillo de San Marcos" (scenario :name "Castillo de San Marcos" :summary "* A monumental castle started in 1638 and took over a century to complete. The upper levels are open to the public, but the lower levels are considered hazardous and are sealed off with packlocked plywood doors. It is easy enough to pry the plywood loose but not without leaving evidence of tampering. The cells of the degenerate prisoners are easy to locate. The walls and ceiling are covered with scratchings of spiders and comets and skulls. In the final cell, a stone can be removed revealing a low tunnel sloping downard. Crawling on hands and knees for fifty yards reveals a hallway from the original Franciscan monastery that predated the fort. The hall leads to a small room with two chairs and black robes hanging from pegs. The room is the same as the one depicted in the films from Thornton's Camera Shop.") "Thornton Camera Store" (scenario :name "Thornton Camera Store" :summary "* The camera store has a view of the castle. William Thornton works here all day selling cameras, lens, and film. There is also a darkroom where he develops photos. * If the investigators break in they can find some smuggled Cuban ponography and three recent silent films in a locked box. * The Films - Each film is roughly the same depicting a dead body in a chair in a small stone room surrounded by hooded figures. A veiled female figure limps over and begins a ritual. The body seems to gain some semblence of life and then the figures leap upon the body and begin eating it at which point the film ends. * If confronted with the films, Thornton claims he received them by accident along with the Cuban films and that they are obviously some kind of homemade hoax.") "Thornton House" (scenario :name "Thornton House" :summary "* Mother Thornton - Mother Thornton is the matriarch of the death cult and has nearly completely transformed into a ghoul. She never goes out in public and wears a veiled hat even in private. * William will normally be at home after 5pm. During the day, the front door is not locked. If Mother Thornton hears intruders, she will stay in her room pretending to be sleeping in a chair. If she is exposed, she throws off the veil and tries to escape the house. She will leap out the second story window lope down the street scattering the citizenry. Any disturbance here will have the police arrive in five minutes where they will arrest anyone in the Thornton home for the murder of Mother Thornton. Even if she is killed the story will be that they killed a deformed and crippled old woman. * Gray Binding - Among her possessions is a book that teaches the Gray Binding spell that animates a corpse into a mindless zombie.") "St. Augustine Ambush" (scenario :name "St. Augustine Ambush" :summary "* The Note - If the investigators are discovered, Detective Packard will arrange a deadly ambush for them. He will kidnap Eli Simpson, Esmerelda, or anyone else who they think can lure the investigators. The victim leaves a note to the investigators that they have new information and to meet at the church graveyard and night. * The Churchyard - The gator farm truck is hidden to the north of the church, and the Maynards and Packard wait in ambush with pistols and blackjacks behind tombstones. At the center of the graveyard, the contact sits on a tombstone under the moonlight. Unfortunately, the victim is already dead and is merely propped up. The ambushers try to take the investigators alive, but will open fire if they have no other choice. * The Ritual - If the investigators are captured, they are taken to the ritual chamber where one of them is eaten alive while the others watch. Before the grisley feast is complete, a number of ghouls come down the tunnel and tear the cultists apart. The ghouls drag away the dead and ignore the living investigators.") "Exposing the Cult" (scenario :name "Exposing the Cult" :summary "* Exposing the Cult - Since Detective Packard is a cultist, any involvement with local police will get the investigators in trouble. If they can bring hard evidence to the Florida State Police, who will move in and clean up the mess, though they will cover up the messier parts to maintain their vital tourist trade."))) "Investigating the Andamans" (section :name "Investigating the Andamans" :scenariomap (scenariomap "Trip to the Adamans" (scenario :name "Trip to the Adamans" :summary "* The Andaman Islands are a narrow chain of islands 590 miles southeast of India. * Weather - The temperature is mild and ranges from 64F to 92F. Except for October and March, the islands are hit by daily monsoons. * Wildlife - There are no large predatory animals, just all manner of bats, rats, spiders, turtles, wild pigs, and native cats. * Population - The natives are primitive Negritoes, belived to have lived here since the Pleistocene era. Uniquely among modern man, they have no knowledge of fire building and must continually keep a fire burning. They are divided into 12 tribes with different dialects of the same language. They have a long reputation as viscious killers and cannibals. For centuries, shipwrecked sailors had been systematically slain (but not eaten). Over time, the islands have become safe to outsiders except in remote areas. * Port Blair - The British established a penal colony on the islands where convicts are forced to live and work. The colonly is a primitive jungle colony with a dock, general store, a wireless, and faily complete medical facilities. Port Blair is also the only deep water anchorage on the islands, so all ships must dock here. * Major Ashley Nichols - Major Nichols is the commissioner of the Andamans. He oversees the trade of exotic lumber, coffee, cocoa, tea, and coconuts. He also commands a small battalion of Indian solders. Nichols is happy to meet civilized westerners and will places his services and those of the British Government at their disposal. * Arrival - The Andamans are 10,000 miles from America. If the investigators use Colin's ship, the trip takes 3-4 weeks. If they book other passage, they will have to travel to Calcutta first. * Office Records - Major Nichols has nothing to hide and allows full access to the office records where a report of Cynthia Baxter's abduction can be found. In the narrative, it is found that although the abductors initially tried to take her by force, that after a short conversatiion, she agreed to go with them and was returned safely the next day. Major Nichols has only met Cynthia twice, since she rarely comes to Port Blair.") "Trek across the Adamans" (scenario :name "Trek across the Adamans" :summary "* Guides - If they request, Major Nichols will provide two Indian guides to lead them to Cynthia's clinic 45 miles away. However, he does warn that the two are criminals, working off their crimes. Worse, there are 2 escaped criminals known to be in the area. They are desperate killers and could be extremely dangerous. * Sikander - A Hindu in his mid-thirties with a wife and three children on the island. He stole a horse and has served eight years so far but is mostly trustworthy. He will, however, steal a weapon for protecting his family if he gets the chance. If successful, he will hide the weapon in the jungle for future retrieval. * Mahbub - A Moslem from Delhi who has served twenty years so far for murder. He speaks little English and is neither garrulous nor energetic. * The Jungle - The trip to Cynthia's clinic starts on timber roads, then footpaths, but before the first day is over they are struggling through thick growths and shallow swamps with no path. The trip takes three days or more, and the guides prove able servants, doing all the work of setting up camp, building a fire, and preparing meals. * The Villiage - A loud buzzing noise emanates from a clearing ahead with a tiny, abandoned villiage. The buzzing comes from a tree with a crude platform 25 feet up. Atop the platform is a rotted human form covered in a mass of undulating insects that are devouring it. Although the Andamanese normally bury their dead, if a particularly revered chief dies, he is bundled in a tree and the clan abandons their villiage for three months in reverence. If the body is disturbed, the Jarawan hunters will track the intruders and attempt to kill them for their blasphemy. * The Mission - Cynthia has a small wooden building that serves as her clinic surrounded by the huts of 20 Andamanese. Nearly a mile from the beach can be seen a 6 mile island covered with dense jungle. If local tribesman believe the island is evil, and only Cynthia has returned alive from it. The inhabitants of the island rarely leave, and when they do it is only to kidnap and kill. * Cynthia Baxter - Cynthia is a large woman, big-boned and slightly overweight. She is very near-sighted, and her voice is high pitched and squeaky. Cynthia will act hospitable to strangers, but she is highly suspiscious of those who would appear at this critical moment in her life. She lost her mother at 8 year old. She nearly died from a spider bite and 12 and began thinking of becoming a catholic nun. Instead, with the encouragement of Uncle Julian, she studied medicine in college. Julian helped her get through medical school, and she is deeply grateful to him. To impress Julian, she became a medical missionary and travelled to the Adamans in 1913. In 1918, she was kidnapped by the Tcho-Tchos from the small island across the strait. The Tcho-Tcho priest saw the mark of the spider on her, and trained her in the nature of Atlach-Nacha, their horrible spider god. Cynthia never had a strong personality and was easily brainwashed and converted to the terrible worship. The priest has convinced her that she has a special detiny (which is horribly true), and now only Julian might be able to turn her from her path. * Cynthia's Journal - In her hut is a journal that describes her facination with the teachings of the Tcho-Tcho priest and her belief that a new sun shall appear in the sky. The journal describes the arrival of Silas Patterson and his interest in the Tcho-Tcho rituals. She also writes of her mixed feeling about sending the 'present' to her father, but the priest insists that he cannot be allowed to interfere.") "Tcho Tcho Island" (scenario :name "Tcho Tcho Island" :summary "* Kidnapping - The arrival of strangers, convinces the priest that the moment has come. He sends men in the night to meet with Cynthia, and she eagarly goes with them. The local Adamanese raise an alarm and many flickering torch lights can be seen from the island. * Tcho Tcho Tribesman - The Tcho Tcho are more asian in appearance than the average Adaman. They are all violent fanatics and will hunt down and capture anyone who invades their island. There are 10 males, 6 females, and 3 children on the island. * Tcho Tcho Priest - The Tcho Tcho priest leads his tribe. He is a long time explorer in the Dreamlands and there he has the form of a twisted dwarf (reflecting his personality). In combat, the priest stands back and casts spells (Dread Curse of Azathoth and Withered Limb) while his comrades fight and die. * Fossil Quarry - An exposed rock in the jungle is covered with fossils of prehistoric arthopods including millipedes, scorpions, and spiders. This rock is the source of the spider from the Baxter home, brought to life by the Child of Atlach-Nacha spell cast by the Tcho Tcho priest. A single enormous spider six-feet across can be found here, and the priest will animate this spider if he gets the chance. Note: Any damaged fossil cannot be reanimated. * Obelisk - In a clearing near the villiage rises a black stone, twenty foot monolith. Though weathered by time, precise geometric designs are clearly visible. These designs are are disturbing to the eye and create a sense of vertigo. Out of the corner of one's eye, they seem to swirl and pulse. If one listens to the stone an almost impercetible rhythmic throbbing can be heard. Crude stones are set up around the obelisk covered in primitive drawings of spiders chasing and consuming tiny humans as shooting stars fall from the heavens. * Metamorphosis - On the night Cynthia is 'kidnapped', she goes directly to the Obelisk. There the tribesmen have gathered to begin the ceremony. Near the Obelisk are bound the 2 escaped killers that Major Nichols warned of as well as any other captured males. Cynthia stands before the altar, removes her clothes and sways to the Tcho Tcho songs. Eventually, she stops, bends over, and the skin along her back splits wide open, revealing a shiny black surface that pulses horribly. As the wrinkling empty skin of Cynthia Baxter is pushed forward, multple legs spill out from the discarded molt, waving feebly, as the huge spider-thing pushes clear. The priest dones Cynthia's discarded skin and wears it like a coat. * The Wedding Feast - Cynthia's new form is not hard enough to move freely until dawn. In the meantime, she is ceremonially wedded to the male sacrifices before she drags herself to each one and begins eating the flesh from the victims head. She finally sucks the brains out through the eyesockets. Each feast takes 20 minutes, and after each is consumed, the still animate corpses with exposed skulls are freed and shamble mindlessly off into the forest. The Onge people sense the threat of the Tcho Tcho and attack the Tcho Tcho. The Tcho Tcho defend Cynthia and the priest as they escape. The Onge will not pursue the Tcho Tcho into jungle at night. Instead the free any remaining prisoners and wait for light. The priest makes his way to the prehistoric rock and casts Child of Atlach-Nacha to animate the giant spider there. * Daughter of Atlach-Nacha - At dawn, Cynthia is fully formed and begins a 3 hour trek across the island to the Caverns of Atlach-Nacha. She is accompanied by hordes of spiders that crawl around and over her. Any who follow will constantly be treading on spiders and have spiders dropping upon them from the trees. Their bites are painful but are not dangerous. * Caverns of Atlach-Nacha - Cynthia travels to a 20 foot cave opening where her father dwells. If she is pursued, she will wait in ambush for her pursuers. If the investigators are foolish enough to continue searching, they will travel through twisting caverns deeper and deeper for over an hour before the cave opens into a vast chasm nearly filled with thick, ropy webs. Continued activity attracts [Atlach-Nacha] himself who resembles a hideous, black, hairy spider with a strange, remotely human-like face with little red, hair-rimmed eyes."))) "Ulthar and Beyond" (section :name "Ulthar and Beyond" :scenariomap (scenariomap "Exploring Ultar" (scenario :name "Exploring Ultar" :summary "* Phillip Baxter's dream journal leads the investigators to start exploring [Ulthar] in the Dreamlands. * Phillip's Dreamform - At some point someone will notice that Phillip Baxter is watching them from a distance. If anyone approaches, his head disappears in a cloud of mist and then he vanishes. * Procession of Burgomaster Kranon - Trumpets announce a parade throught the streets for Burgomaster Kranon. The Burgomaster is immediately recognizable as Matthew, Julian Baxter's ward. In the Dreamlands, his emotional and mental handicaps don't exist. If the investigators can get an audience, Krannon can be convinced to help them, both here and in the real world. * Cthaat Aquadingen - At the [Library at Ultar], the investigators can search for the [Cthaat Aquadingen]. The book is bound in soft, human skin, still pliable, and always moist from perspiration welling from its pores. Simply handling the book is creepy. Within the book can be found a quote: The stars fall, the beast bred of stone rampages, and a time of great change comes. Deep within perfumed Kled, where life turns to death, the Watcher in the Glade knows the time and place of the coming. Chinese notes are written in the margin of the page. If they are translated, they comment that the Pnankotic Manuscripts mentions the Watcher in the Glade. * Pnakotic Manuscripts - If read, the manuscripts describe that the Watcher in the Glade is the Great Old One Yibb-Tstil. Priests of Yibb-Tstil meet at the great pool in front of the ivory palace. Priests then grovel on hands and knees before Yibb-Tstil and must not look upon him. priests of * Carnival - While leaving Ultar, the dreamers chance upon a carnival tent. A barker announces that they have the only captive Colossal purple spider from the distant north. Admission is a dime or anything of value. The interior of the tent is larger than the outside would suggest, and in a barred cage at the back of the tent is a purple spider the size of a car hovering over the dessicated body of a sheep. If anyone tries to talk to the spider, it speaks in a thin, dry voice. It is, however, not helpful and eventually hisses. The barker comes running in and ushers them out. If they want to speak more, the barker says: 'It is not up to me you see'. The spider then says: 'After all, I am the master here.' If the barker is questioned about the dwarf who works here, he tells them the dwarf quit some time ago and headed to Kled.") "Journey to Kled" (scenario :name "Journey to Kled" :summary "* The perfumed Jungle of Kled can be reached by traveling North from the Enchanted Wood to Thran. At Thran a elephant caravan can be taken over land or a river boat can be taken to Hlanith where passage on a ship can be found to Kled. * Numerous ivory palaces dot the jungles. If the dreamers ask about the great pool mentioned in the Pnakotic Manuscripts, the guides recognize it as the Palace of the Sacred Fount. * Palace of the Sacred Fount - The palaces is one of the less feared locations, though it is still avoided. As with other ivory palaces in Kled, the palace is somehow physically in perfect condition though the rooms are empty and the floors are thick with dirt and leaves. The smell in the area is a unique musky odor that immediately reminds the dreamers of the smell during the dream of the death of Phillip Baxter. The front hallway is an atrium where rain water falls to collect in a rectangular pool. At the far end of the pool stands a huge jade statue of an evil-looking hyena. The statue leers with gaping jaws over the pool. The apparently bottomless pool is dark and filthly from rotting leaves, a peculiar oily film covers its surface. Despite its appearance the pool is not dangerous. * Phillip's Ghost - A distant cackling sound can be heard. Following the sound, the dreamers find a stairway going down many flights with torchlight below. At the bottom of the stairs, the dreamers find a torchlit hallway with a cell at the end. Within a cackling dwarf uses a human femur to visciously beat a glowing, partially headless, staggering figure. The dwarf is hunched and misshapen and has a terrible, inhuman face. Its lips are drawn into a snarl over three-inch fangs. Its eyes are glowing red pits. The figure is the dreamform of Phillip Baxter. If he is rescued, his headless form is mindless and helpless. The dwarf with not help under any circumstances. * Path to Yib-Tstll - Behind the Palace the jungle becomes stunted and twisted, tree trunks are bent at odd angles, and a general sense of disease pervades the growth. Futher on, alien foliage begins to appear including quivering fungi and twisting weird ferns. Further still, a great stone arch can be seen surrounded by dead trees. Through the arch can be seen another alien jungle evidently on a far-off world. The arch is clearly a permanent gate, and plants and insects can be seen crossing both ways as if the arch were simple stone. * World of Yib-Tstll - Beyond the arch, the sky is dark green and starless. Swollen insects swoop ominously from deadly-looking blooms. Flying horrors with veinous wings fly high above. Not far away, a vast, black clearing is visible. * The Clearing - The clearing is roughly a mile across. The black surface is composed of fine flakes like snow, but it is warm to the touch. If the dreamers heed the Pnakotic Manuscripts, they should crawl on hands and knees across the black clearing facing the ground to avoid actually seeing Yibb-Tstll. As the dreamers near the center, Yib-Tstll rises suddenly from the black clearing. Dreamers may attempt to avert their gaze or suffer the madness induced by his presence. * [Yibb-Tstll] - The massive being speaks telepathically with a booming alien voice. Each dreamer must make a [Spirit] test or Yibb-Tstll will ignore that person completely. If the test is completely failed, Yibb-Tstll will touch the person and impart its feared reversal. Yibb-Tstll is suprisingly helpful and will answer questions about the Cthulhu Mythos and things of cosmic import including Nemesis, but he will only give a single answer on a subject and will not clarify himself. * Reversals - Any dreamer who suffers a reversal will instantly be driven insane or his human form or dream form will be permanently killed. If an insane dreamer is brought to him, Yibb-Tstll will fully restore his sanity. If the dwarf is present, Yibb-Tstll will reverse him, and his dream form will change into the Tcho-Tcho priest while his real form will become the dwarf. If the headless form and the ghoul's page are brought before him, he touches them both and Phillip Baxter's dream fomr is restored, but back in the real world, Silas Patterson has become a mad imitation of Phillip Baxter. * Web of Eibon - Yibb-Tstll instructed Eibon in his construction of the Web of Eibon spell with which he planned to freeze time around Nemesis (and Earth) to prevent Earth's destruction. Yibb-Tstll knows his efforts will fail in the end, but it provided the instructions anyway.") "The Quest of Ghouls" (scenario :name "The Quest of Ghouls" :summary "* Ghoul Dream - After the events at St. Augustine and the Dreamlands, one night the investigators find themselves having hazy dreams of the graveyard at St. Augustine. Suddenly, the dream sharpens and 3 figures start crawling from an open grave: ghouls like the ones that may have been seen at St. Augustine. The ghouls stinking breath reeks of death and decay. The ghouls do not appear to be hostile, instead they start urging the investigators to come with them to see the wise man and there is little time left before dawn. A terrific stench issues from the open grave. Below rotten bits of wood and fabric lie on the grave floor and a narrow, twisting tunnel leads into darkness. The ghouls gibber that they must hurry and start climbing down the hole. If the dreamers don't follow the tunnel begins to slowly close. If the dreamers still do not follow, they awake normally, but the opportunity to learn more has been lost. If they do follow, the tunnel collapses behind them and they will have to follow the ghouls forward. * Grath the Leader - Young and handsome by ghoul standards, Grath leads the group and most often speaks with the dreamers. He had a riding zebra, but the group got hungry and ate most of it. * Mairpl the Big - Mairpl is much larger than the others, speaks little, and wields a club in battle. * Ug the Hungry - The worst and most degenerate of them, Ug speak no human language and spends most of his time on four legs. He avoids the humans, but can often be seen staring and drooling over them. He possess no threat, but he likes to fantasize. * The Page - At the end of the tunnel waits the Page. The Page is wrapped in a dirty brown cloak with his face hidden. His body is bent forward and staggers under the weight of an enormous tombstone chained to his back. The ghouls order the Page around and play viscious practical jokes on him. Below the hood can be found Sila Patterson's face, though it shows no recognition. Upon the tombstone is written 'Phillip A. Baxter 1865-1925.' The Page is, of course, the dream form of Silas Patterson, suffering from the guilt of the death of his friend. * The Quest - The ghoul gang seeks to rescue a female ghoul Horella who has disappeared. The ghouls are fairly melodramatic about how beautiful she is and how they must rescue her from whatever peril she is in. To find Horella, they seek the insight of the wise Man of the Mountain. This man supposedly is very wise and will answer any questions. * Social Ettiquette - After a few hours of travel, the ghouls stop for nourishment. They squat down and rummage through their stained sacks. They produce vaguely familiar cuts of raw meat with tinges of green along with sour wine. The source of the meat is all too obvious. The ghouls like their food well-aged and, out of respect, offer their guests the oldest pieces. The bags also contain the remains of Grath's zebra which the ghouls are more than happy to hand over, leaving the tastier pieces for themselves.") "Journey to the Stony Desert" (scenario :name "Journey to the Stony Desert" :summary "* The Underworld - The ghoul tunnel leads to the Underworld. Once in the Underworld, the tunnel leads upward for 3 days through the center of a huge mountain. Many ohter tunnels branch off, but the ghouls seem to know their way. Drinking water oozes down the rock wall. Bloated fungi, pale, foot-long crickets, and eyeless carnivorous rats server as food. Most of the trip is in complete darkness. Occasionally, luminescent fungi provide a tiny amount of light. The tunnels connect the Vaults of Zin where dangerous ghasts, serpent folk, or worse may be encountered. Eventually, the group exits the Underworld at the border of the [Stony Desert]. * [Stony Desert] - Grath says the journey eastward across the desert will only take a few days. They seek the sacred mountain [Mt. Hatheg-Kla] where a holy man can tell them where fair Horella can be found. * Walker of the Stony Desert - A few days journey into the desert, the dreamers see, off in the distance, a man leading a horse. They will meet in about an hour. As they draw near, it is clear that the man is enormous, towering over the horse. He is 8 feet tall, 400 lbs, and dressed all in black. His horse seems old and tired and lags behind being pulled by a rope. The horse is an elderly nag with cataract films covering both eyes. The ghouls are terrified of the man and will not approach. He does not stop walking unless he is attacked. This being is the dream-form of Eibon. the Hyperborean wizard who, like the spell he cast to capture Eibon is bound to travel back and forth across the Stony Desert. A legend says that one day he shall find a way out of the desert. On that day, the horse shall be healthy and the man shall then ride the horse. Where he goes then, he does not know for the horse shall be the master. He freely discusses his trip across the desert, Mythos knowledge, Nemesis, and his spell the Web of Eibon that Yibb-Tstl taught him. He now knows that stagnation is worse than destruction by Nemesis. If asked about Nemesis, he produces a large, shining jewel from the air and offers it to the dreamers. He says simply that all brave souls will know what to do when the time comes. Any attempt to attack Eibon results in him disappearing and reappearing far in the distance continuing his endless travels.") "The Man on the Mountain" (scenario :name "The Man on the Mountain" :summary "* [Hatheg-Kla] - A day or two after meeting the Walker, the slabs become more numerous. As they approach Mt. Hatheg-Kla, smoe of the slabs are still turned upright in the ground and bear traces of ancient carvings. Soon it becomes obvious that they are travelling in a titanic graveyard. * Climbing Hatheg-Kla - Mairpl assures them that this is the only way to see the holy man and ask where Horella is being kept. The other ghouls will wait here while Mairpl and any brave dreamers attempt the climb. The way up seems somewhat trecherous and will require a [Climb] roll to succeed. If that roll fails, a second [Climb] roll must be made to catch yourself before you fall to your doom. Unfortunately, Mairpl fails both rolls and falls far below splattering on the rocks and potentially injuring those below. After a short period of remorse, Grath and Ug gather some of the larger pieces and add them to their provision bags. * The Man on the Mountain - Near the skull tree, an old, bearded man in a yellow robe sits on a heap of corpses plundered from the cemetary below. He deftly uses a silver hatchet to cut pieces of the corpses and flings the dripping gobbets above his head as the circling Byakhees swoop down to catch them from the air. As the dreamers approach, the Byakhee scream and chatter, but the man pays them no mind. If hailed, he smiles warmly, and if asked questions he will honestly answer based on his vast knowledge of the Dreamlands and the Mythos. Knowledge comes at a price, so before he answers each question, he hurls his hatchet at the questioner which instantly slices off an appendage, starting with a hand. The Byakhee swoop down and eat the tidbit. The wound does not bleed and only hurts for a moment. The damage is permanent in the Dreamlands, but each time a dreamer returns to the Dreamlands one wound is healed. If asked, he tells that Horella is at the castle of Bombel, the giant, in the hills to the east of the [Stony Desert]. Anyone foolish enough to attach the man, is attacked by the Byakhee, rended to pieces, and eaten. * Cave of the Child God - Behind the tree, the shear face of Hatheg-Kla rises another 1000 feet before the cave entrance. A flight of steps, each one foot wide, criss-crosses back and forth up the slope. Anyone nearing the opening hears a deep sobbing and suckling sound as if from some enormous infant. The cave itself is completely black and no light will penetrate it. If anyone enters, a few seconds later, horrifying screams of agony echo from the cave accompanied by sucking, popping sounds and a soft, cooing voice. The screams continue for almost a minute before they are choked off by a gurgling, bubbling sound and a huge spray of blood that shoots from the cave. The character's dream-self is dead, and his waking self has been driven mad by the horrific dreamform of Nemesis.") "Castle of Bombel" (scenario :name "Castle of Bombel" :summary "* To the Castle - The Man on the Mountain has directed the dreamers toward a castle to the east of the [Stony Desert]. The trip takes a few days through the desert and another day throught wooded hills. * The Castle - The rude, three-story castle is in a clearing. It has a single window at the top and a door at the bottom. * Bombel - Near the castle, sitting on a boulder is a huge [Gug]. At the first sign of intruders, it rushes to the attack. * Horella - Shortly after Bombel starts fighting, a foul-looking, scaly ghoul appears in the window. This is Horella, and she immediately begins hurling vile insults and rocks at the Gug. The ghouls are cheered on by her presence, but if someone listens they realize that she is exhorting Bombel to kill the intruders. Dreamers may also notice previous bruises on Bombel's head. If Bombel falls, Horella turns her insults and rocks at her would-be rescuers. Any remaining ghouls grab a chain from their bags, say 'To the rescue', capture Horella, and drag her bumping down the stairs. The ghouls bid farewell and will offer the page as a reward for the dreamers help."))) "Nemesis: Spawn of Azathoth" (section :name "Nemesis: Spawn of Azathoth" :scenariomap (scenariomap "Trip to Darjeeling" (scenario :name "Trip to Darjeeling" :summary "* Francis Wilson - Francis is one of the Tuesday Night Academy. He was at Phillip's funeral and he has been in Russia researching the Tunguska Blast and its possible relationship to Nemesis. He has made some discoveries and sends a telegram to Judge Braddock who forwards it along. The message says to leave immediately for Darjeeling, India and to meet Colonel Hugh Huntley of the British Foreign Office. * Darjeeling - * Colonel Hugh Huntley - Francis has arranged with the British Foreign Office to allow the investigators to travel to Lhasa, Tibet to aid him in his research. Colonel Huntley provides them with papers and can help arrange transport to the British Legation in Lhasa where Francis Wilson is staying. * Road to Lhasa - The 400 mile journey to Lhasa can only be taken on foot or via horse-drawn caravan. The route is heavily trafficked by pilgrims, traders, smugglers, and spies. The journey takes weeks and is alternately terrifying, boring, facinating, cold, and misery-making. * Lhasa - Lhasa is a sprawling squat city with no building taller than 2 stories except for the Potala, the home of the Dalai Lama. The Potala is a bulky, stone structure that is imposing but unattractive. * The British Legation - The Legation is on the outskirts of Lhasa. Here Francis Wilson has residence. He seems thinner and more stressed than at the funeral. He has been researching the Tunguska Blast and mad Rasputin's apparent presence at the blast. After piecing together his research, he illegally entered the Soviet Union and stole parts of Rasputin's journal. He then fled to Tibet through Mongolia. He has been translating sections since then. He claims that Rasputin met someone called Eibon in his dreams, and that this Eibon told him of his own death. Eibon also warned him of a dark star that would fall from the sky. This Eibon gave him a stone that he used to destoy the star. He further foretells another dark star that would fall long after Rasputin's death in Tibet. Francis guesses that the location may be near an abandoned temple roughly 300 miles north of Lhasa. He has found a guide Lha-bzang who studied in the temple as a child. * Lha-bzang - Francis plans to travel there soon with a native Tibetan, Lha-bzang. Lha-bzang is a domden, a Tibetan mortician. A skilled Anthropologist may recall that Tibetan funeral rites involve the corpse being hacked to bits by the axe-wielding domden and then fed to ravens or vultures. Lha-bzang's dream form is the holy man on the mountain. Lha-bzang is going on the journey to expand his spiritual understanding. Unfortunately, he has also been paid off by a Soviet spy. If questioned about the temple, he says he was sold as a slave as a child but he fled the temple when he realized that their teachings were not Buddhist. * Ivan Dorkyev - A Soviet spy who has been tracking Francis down since Francis stole Rasputin's journal in Leningrad. He is over 6 feet tall and is dressed in the tattered robes of a yak-herder. Beneath, he carries two pistols, a knife, and a bandolier of ammo. He hides at his camp in the mountains near the ruins waiting for Lha-bzang to bring Francis. * Trip to the Ruins - Lha-bzang leads the expedition 300 miles through a tangle of steep mountain passes, brackish lakes, and arid valleys. On the way, they encounter kay-herders, small mountain monasteries, and moutain farms. About 2 weeks in to the trip, while camped, a minor earth tremor shakes everyone awake. A week laker, they arrive at the Nenmka temple, sitting on the slope of a mountain. * The Temple - The temple is now just a windswept ruin. A Mythos knowledge test reveals that the fallen columns have inscriptions used to invoke Hastur. The Soviet spy has watched the investigators approach and waits in hiding nearby. Lha-bzang finds a section of flooring with symbols on a tile. Here he will perform a ceremony to discover more about Nemesis. * The Ceremony - Lha-bzang sits and lights a clay pipe containing a tarball of hashish. He passes the pipe around and then begins a droning wail. After 30 minutes, he retrieves a knife and a freshly severed human hand from his bag. He cuts his own palm, smears blood on the hand, and binds the cut. He then passes the knife to each person to do the same. If any will not, he gestures for them to leave the prayer circle. After another 5 minutes, the hand twitches and then turns toward Lha-bzang. He asks where can they find the Seed of Nemesis. The hand then crawls to a symbols on the ground indicating 'not far' and 'north-east'. Additional questions may be asked but each question causes the questioner to receive a minor Sanity Wound. Answers are always very short, and the hand only knows local events. The Soviet spy waits nearby but has accepted Lha-bzang's demand to allow the ceremony to complete before acting. * Confrontation - Just as the ceremony is concluded, Ivan steps into the room brandishing his pistols and warning everyone to stay where they are. He is deadly serious and will gun down anyone who makes sudden movements. Ivan plans to take Francis back to the Soviet Union to stand trial for the many laws he has broken and suspiscion of being a spy. He has no knowledge of Nemesis and has nothing but contempt for the superstitious, religious ritual. If given the chance, he will tie up the investigators and then take Francis and Lha-bzang (his ally) in the morning. * The Fallen Seed - In the early morning, everything changes. Along with the bright sun, a halo forms in the sky, though this halo does not surround anything visible, yet. Dorkyev is thunder-struck; he and Francis exchange words in Russian. Ever the pragmatist, Dorkyev frees everyone and begins a descent toward the valley under the halo. Within the valley, the halo light is flat and oily, and its color melts through shades of yellow and green as though through a prism. Lha-bzang vomits and flees. Suddenly, all present feel their hair stand on end as the halo darkens and takes on a dull gun-metal hue. The slight wind disappears and everything is silent. Then, high above a sizzling sound grows in intensity. Suddenly a hideous scream is heard followed by a thunderous blast that knocks everyone off their feet. Everyone suffer partial hearing loss and if a check versus [Body] is completely failed, the loss is permanent. A blinding light rips through the sky and crashes to Earth over the valley ridge that Lha-bzang crossed. A massive explosion rocks the ground and a curtain of flame passes overhead. If not for the ridge, everyone would have been incinerated along with Lha-bzang. * Crater - Peeking over the ridge, a 20 foot crater can be seen with a sickly, green light emanating from it. Wilson frantically says that Eibon's symbol must be placed on the Seed or it will destroy the Earth. Those who have witnessed the Seed in Montana know that any who approach the Seed will die: quickly or slowly. If no one volunteers and no one has a plan, Dorkyev swears, snears of their cowardice, and takes the jewel to the crater. Alas, just as he climbs the crater and is exposed to the light, he screams and immediately melts into a puddle before everyone's horrified sight. Worse, he drops the jewel into the crater. If someone uses a mirror, they can see the jewel near the Seed which is slowly melting the rock around it with its terrible power. Wilson adamantly refuses to go (and will melt if pushed), so someone will have to sacrifice themself or watch the Seed sink into the ground and doom the world. * Eye to Azathoh - The doomed person must resist the corrupting rays, retrieve the jewel, and then touch it to the Seed. Nothing happens for a few moments, then the Seed suddenly shimmers and disappers with a sharp pop. The Seed is gone but a black, marble tunnel lies in its place. The jewel lies on the ground before the tunnel. Hyperborean symbols line the tunnel. This is Eibon's work. When the jewel crosses the threshold, it suddenly reverts to the heavy glowing stone from the Dreamlands. There is a steady breeze down the tunnel and a light can be seen ahead. After 100 meters, a room 250 meter, circular opens up. The room is the exact same shape as the jewel. The breeze has become a howling gale ending in a 5 meter gateway in the center of the other end of the room. The gateway in the center of the oval room gives the impression of an eye looking out into space. * Gateway - The gateway can be reached by a ramp that slopes upward 50 meters. Stars can clearly be seen through the opening, and it is clear that the gate leads directly into outer space. Anyone who has been exposed to the Seed radiance, has an intense desire to go through the gate and join Nemesis. Anyone approaching the gate will need ropes or climbing skill to cling to the reliefs on the floor or be sucked into oblivion. Also, the jewel gains weight as it approaches the gate, as if it is resisting, eventually becoming over 100lbs. If someone can get close or has binoculars, that person will see that the area of space beyond the portal is filled with criss-crossing black lines forming a faint web. Someone may recognize the black substance and The Black associated with Yibb-Tsll. This is Eibon's Web taught to him by Yibb-Tsll. Within the web, an observers intuitively senses that time is slowing to a crawl. Further, the web is creeping through the portal into our world. This is how mad Eibon hoped to save mankind, by freezing us forever in time, so Nemesis can never destroy us. * The End - If the jewel is brought near the gate, in addition to its increased weight, the Black lines start to reach toward the jewel. Simply hurling the jewel through the portal will gather all the webs onto the jewel which breaks the spell of Eibon. If anyone returns to the Stony Desert, they will no longer find Eibon there. The world will no longer be trapped forever in frozen time, but Nemesis will still return some day to end the world, but it will not be today.")))) :unitmap (unitmap "Julian Baxter" (unit :name "Julian Baxter" :summary "* Julian Baxter is a priest and brother of Phillip Baxter. He is confined to a wheelchair and is heavily dependent on his son Matthew. Before becoming a priest, Julian was educated as a psychotherapist. He has traveled the world on missions, but since becoming crippled he has returned to his home town. * Julian has a copy of the Book of Eibon in his library. It has a section where Eibon fortells the end of mankind with the coming of Nemesis. Eibon was obcessed with preventing man's destruction and spent the rest of his life developing a ritual call the Web of Fate that would supposedly save mankind when the time was right. Eibon claims that as Nemesis approaches, the Web of Fate will draw together seemingly unrelated events, defeat Nemesis, and create an eternal golden age for mankind. The reading clearly shows Eibon's progressive descent into madness.") "Matthew Baxter" (unit :name "Matthew Baxter" :summary "* Matthew is the adopted, grown son of Julian Baxter. He is strong, but he is also mute and aeuteistic. This combination makes him appear simple, but he is actually quite competent. He is an avid dreamer where there is no trace of his aeutism. In dreams he is a city council member in Ultar. He can be a strong ally, but he must be approached in the Dreamlands, as it is impossible to gain his friendship in the real world.") "Silas Patterson" (unit :name "Silas Patterson" :summary "* Silas is a friend of both Phillip and Julian Baxter, a past professor at Brown University, a former antrhopologist, and a member of the Tuesday Night Academy. He is quite fit considering his age. * Silas met Julian Baxter in the Congo in 1904 and became friends. In 1919, he met Cynthia Baxter, Julian's niece in the Andaman Islands. In 1920, he came to Providence where he met Phillip and joined the Tuesday Night Academy. Phillip soon after helped him get a teaching position at Brown. * Silas practices a form of cannibalism he learned in New Guinea at the instruction of a degenerate Tcho-Tcho priest. The ceremony involves eating the brains of a recently slain primate to gain extended life. This habit made him lose his job at Brown when it was discovered that he was stealing monkey corpse from the lab. He has since made an arrangement with a local undertaker with low moral character, Alvin Beswick. Silas told Beswick that he was performing brain research, but Beswick is just concerned with the money. Beswick allows him access to closed coffin corpses for a price. He was given access to Phillip's corpse and noticed the small bite marks on the scalp. While devouring the brain, Phillip suddenly lurched back to consciousness and thrased wilding before dying. Silas was terrified and is wracked with guilt over his friend's death. He is maintaining his sanity through denial, and if he is forced to confront what he has done, he will retreat inward and become catatonic and need to be institutionalized. * Silas is friendly, but he not only knows his role in Phillip's death but is reasonably sure that Cynthia was involved. He is planning to return to the Andaman Islands to investigate Cynthia's activities and also because it is getting hard to hide his youth in Providence. * In Sila's desk can be found notes for his next book, about cannibalism. The notes indicate that Silas is unbalanaced. In his files can be found the lease to a farmhouse. * Investigating the farmhouse, leads to the table where Phillip met his end. No attempt has been mde to cover up the crime."))) "Mythos Scenarios" (section :name "Mythos Scenarios" :sectionmap (sectionmap "Seeds of Azathoth" (section :name "Seeds of Azathoth" :summary "* Nemesis - Since 1984, a theory attempts to explain the mass extinctions that occur every 27 million years. The theory submits that a brown dwarf star orbits our sun at 95,000 AUs and every 27 million years it approaches close enough to rain comets throughout the solar system causing climate change, mass-extinctions, and similar catastrophes. * Seeds of Azathoth - Nemesis is, in reality, a Spawn of Azathoth that has clung to orbit around the Sun. Occasionally, pieces of Nemesis break free, falling into the solar system: the Seeds of Azathoth. Seeds that strike the Sun are destroyed, but if a seed strikes a planet, it can melt into the planet's core where it grows immensely, eventually forming a new Spawn which emerges from the broken planet like a snake from an egg. Our system's original fifth world was so parasitized. Its remnants compose the asteroid belt. * For millenia, human and other astronomers have seen in comets, 'hairy stars', approaching disaster and ill-fortune. In ancient texts, comets have been blamed for the revolt of the Shoggoths against the Elder Things, the doom of the dinosaurs, the fall of the empire of the Serpent People, the destruction of Hyperborea, the sinking of Atlantis, and even the two ages of chaos that struck early Egypt. * The most recent effect of Nemesis took place in central Siberia, June 30, 1908, when a tremendous explosion rocked the area for hundreds of miles. There was a pillar of fire and shock waves powerful enough to knock down horses 400 miles away." :sectionmap (sectionmap "The Case of Phillip Baxter" (section :name "The Case of Phillip Baxter" :scenariomap (scenariomap "Figure in the Night" (scenario :name "Figure in the Night" :summary "* An investigator wakes suddenly in the night to see the room bathed in pale green light and a strange musky smell. A vague, ghostly figure gestures toward the investigator. Suddenly, a portion of its head disappears as if bitten off. The spectre stumbles and thrashes around the room as more of the head is eaten until it is completely headless. The figure goes rigid and fades away leaving the room in darkness. * After contemplation, the figure is recognized as Professor Phillip Baxter a former teacher of the investigator. * Contacting Phillip's home gets the distraught housekeeper, Angela Vincenzo. She informs them that Phillip passed away yesterday of a sudden illness. She invites them to the funeral the next morning. * A successful Occult roll indicates that an apparition usually appears at the moment of death instead of a day later.") "Funeral of Phillip Baxter" (scenario :name "Funeral of Phillip Baxter" :summary "The services are in the rain and attended by: * Julian Baxter, the priest, in a wheelchair. * Matthew, the priest's personal attendant, who is a large, silent man. * Emmott Baxter, elder son of the deceased. * Dr. Douglas Walters, the family physician. * Silas Patterson, anthropologist and member of the Tuesday Night Academy. * Judge Braddock, executor of the estate. * Angela, the housekeeper. * Alvin Beswick, undertaker and hearse driver.") "Legacy of Phillip Baxter" (scenario :name "Legacy of Phillip Baxter" :summary "* Angela receives the property * Half of his cash goes to the Tuesday Night Academy * The remaining half goes to his three children Emmott, Colin, and Cynthia. Cynthia's portion to be donated to the Catholic Widow's Relief Fund as she requested. * At this, Emmott accuses Silas Patterson and his Tuesday Night Academy of wasting all his father's money in life and now in death. * Finally, a packet of papers is given to the investigators according to the will. This packet contains Phillip's dream journal and an short note about why he thought the investigators might be interested.") "Dream Journal of Phillip Baxter" (scenario :name "Dream Journal of Phillip Baxter" :summary "* The enclosed note describes that his dreams had become more vivid and recurring recently and that he felt that he needed to write them down and give them to someone who might find the account scientifically interesting. * He had traveled to Ultar and visited the library there. In the library, he found the book, the [Cthaat Aquadingen] which gave important insight into his current research. As Phillip left the library, he saw an evil-looking dwarf that he had seen in a carnival he passed on the way into the city. The dwarf was discretely following him. Phillip managed to shake him before he woke up. * Anyone experienced in the Dreamlands will recognize the entrance to the Dreamlands and Ultar.") "Home of Phillip Baxter" (scenario :name "Home of Phillip Baxter" :summary "* Angela Vincenzo, the former housekeeper is now the only resident in the roomy three bedroom home. * The study contains various paperwork including: ** A letter from Phillip's daughter Cynthia describing that her supposed kidnapping by natives was not as serious as he was led to believe and that she is perfectly fine. She has sent a box of coconuts as a present. ** Notes on the Tuesday Night Academy's purchase of a large telescope and their search for a 'Dark Star' called Nemesis. ** An anthropology book authored by Silas Patterson with marked section describing southeast Indian tribes displaying remnants of ritual cannibalism. Most are symbolic acts upon the death of a family member or friend, but on occasion the ritual is actually performed using a monkey or ape substitued for a human. Of particular interest is a brain eating custom where the brain is exposed and eaten directly from the skull while still warm. An elderly native said that he had seen apes killing smaller monkeys and eating their brains in similar manner. ** A diary including comments about: *** His brother Julian sudden sickness and retirement after returning from the Andaman Islands. *** Julian's subsequent suicide attempt *** Cynthia's trip to the Andaman Islands and subsequent abduction by savages. *** Her later release *** Arguments with his sons over favoritism *** His recent series of nightmares *** His therapy with Julian over his nightmares and the drug Julian prepared to help him sleep. *** The ultra-realistic new dreams after the drug put him into an especially deep sleep. *** Julian's refusal to provide more of the drug. *** Phillip's break-in of Julian's house and the successful theft of the drug. * The basement contains an unopened crate of coconuts with a small hole chewed through the side. * The attic contains a formerly extinct prehistoric spider that was in the crate of coconuts. It had bitten Phillip in his sleep and put him into a deep coma that was mistaken for death. The spider venom causes unconsciousness in 10 minutes, but the victim will revive on its own within two days."))) "Search for the Seed" (section :name "Search for the Seed" :scenariomap (scenariomap "The Garrison Observatory" (scenario :name "The Garrison Observatory" :summary "* The Tuesday Night Academy has spent a large sum of money to erect an observatory in Garrison Montana. They experiment with prisms to try to detect the dark star that their research claims has had a sweeping effect on history. * The Observatory is deep in the woods and is only accessible on horseback.") "The Defenders of the Seed" (scenario :name "The Defenders of the Seed" :summary "* The Seed - A Seed of Azathoth has been hurtling through space for centuries and has finally been drawn to Earth. As it approached, the special prisms in the telescope attracted it like sunlight off a mirror. The Seed swept across the sky and crashed in the woods. Its strange green fire trail attracted the attention of many including those at the observatory and a group of local hunters. * Sasquatch - When the hunters found and examined the asteroid, they were exposed to the horrific radiations of the Seed. Those that survived, regressed to a primitive state. They are terrified by the Seed, but are compulsively drawn to it. They have buried the Seed in an alcove of the cave in which they live. The Seed is slowly killing them, and as they die, they dissolve into a primordial soup before actually dying. * Sylvian Englund - Sylvia is a pleasant woman in her late sixties who lives off the land in the woods since the death of her husband. She has recently discovered the regressed hunters and believes that they are Sasquatch. She has been feeding them and has gained their trust. She enjoys her discovery and does not want outsiders to ruin her friendship with the sasquatch.") "The Race for the Seed" (scenario :name "The Race for the Seed" :summary "* Fungi From Yuggoth - A team of four Mi-go have observed the Seed's landing from their underground outpost on the Moon. Their goal is to retrieve the Seed to use as an magical energy source. Interesting humans captured along the way are to be de-brained and the brains carried back in cylinders for questioning later. * They each carry a machine that looks like a silver whorl. It fires a beam of deadly radiance that eats blackening holes in whatever it touches. Any damage prevented by armor is instead applied against the armor itself. The weapons have 37 charges and may not be recharged. The weapons have no range limitations and are excellent sniper weapons. * Their first target is the firetower where they slay Ranger Marshall and use the tower as a base of operations. * The next day they spray a nervous tissue solvent in the direct vicinity of the firetower to prevent intrusions. The spray forms a low fog that short circuits animal nervous systems driving them mad. A Grizzley Bear and Jules, Sylvia Englund's dog, are the first victims of the gas. Both roam the countryside acting randomly. * Later the same day, the Fungi search the observatory, leaving many tell-tale signs. * The next day, they capture Sylvia Englund near her ranch. They de-brain her and hide the body in the house. * Toward the end of the day, they move on the Seed. They make quick work of the hunters defending it. They carefully put the seed in a shielded container and fly it to the firetower. They gather their belongings, including the Seed and any captured brains, drop a bomb on the firetower to destroy any evidence, and fly back to the Moon."))) "Death in St. Augustine" (section :name "Death in St. Augustine" :scenariomap (scenariomap "Investigating Colin Baxter" (scenario :name "Investigating Colin Baxter" :summary "* Colin Baxter, Phillip's youngest child, is due a healthy piece of Phillip's estate, but he must be located first. His last known location was St. Augstine, Florida. Judge Braddock is concerned with the series of bizarre occurences and hires the investigators to track Colin down and check on his safety. * St. Augustine is a city in northeast Florida and the oldest continuously occupied European-established settlement in the continental United States. * Colin is indeed still here, but he has fallen on hard times and turned to alcohol. He can be found in a local speakeasy hidden behind a grocery store. * Harry Spitz - The grocery store/speakeasy is owned by Harry Spitz who runs the bar. He pays protection money to the police and is in no danger of police action. * Billy Wolff - Billy is a close friend of Colin's and will steadfastly defend his buddy in all circumstances, especially when drinking. * Esmerelda - Esmerelda is a Cuban born, hot-headed friend of Colin's. She is an illegal immigrant and will not reveal her last name under any circumstances to, somehow, protect her family.") "Colin's Treasure" (scenario :name "Colin's Treasure" :summary "* Colin has a history of get rich quick schemes and his current one is to find a fortune in sunken treasure. Unfortunately, his business partner ran away taking their remaining cash and Colin's girlfriend with him. Since then, Colin has been drinking his troubles away. * The inheritance money helps, but Colin is still short $2,000. He will offer the characters 50% of the profits if they chip in the money. * He believes that the wreck of the treasure galleon, La Rosaria can be found off Bimini. He claims to have an accurate map to the location. His map is hand copied from an original kept in the library of the 200 year old Spanish church. * Father Garcia - At the church they meet Father Garcia who is a friend of Esmerelda. Father Garcia is friendly but guarded. With the help of Esmerelda he admits that he fears that someone is watching him. He also admits to seeing figures moving in the dark on the church grounds, though he feels he must be imagining things. After gaining his trust, Father Garcia shares the church library. Though Colin's research is shoddy, futher research supports his findings that the map is an authentic map of the location of the La Rosaria.") "Colin's Wreck" (scenario :name "Colin's Wreck" :summary "* The Palencia - Colin invites the party aboard the old steamer he has bought and retrofitted for large scale salvage. The crew is mostly Cubans and blacks. As they depart, someone spots a reflection from the coast. Using binoculars, they see someone observing them back with binoculars before the person ducks away. * The Voyage - The map shows a location off Bimini, 300 miles south of St. Augustine. The voyage takes less than 24 hours on calm seas. * Diving - The diving pumps have enough pressure for no more than 2 divers at once. Wolff operates the pumps. Colin would prefer to dive with a partner and asks for volunteers. The divers reach the bottom in 2 minutes and tug twice on the line to indicate they are at bottom. The water is particularly clear and well illuminated by sunlight. Only 20 minutes later they spot the wreck and tug twice again. The divers return to the surface and describe that the wreck is in only 50 feet of water but is stuck on a reef hanging over a sharp drop off on one side. * Coral Outcropping - A protruding coral outcropping has pierced the hold of the hull. Anyone exploring this area will be the victim of a single sudden attack by the [Moray Eel] that makes its home here. The attack is not life threatening, but if the person bleeds the divers will have to return to the surface for fear of attracting sharks. * The Drop Off - Anyone foolish enough to explore the deck near the drop off, suddenly causes a section of the hull to break off and fall into the drop off. The falling diver can attempt to jump free, failing that he can scramble to grab the coral reef as he falls, otherwise he slowly falls 30 feet before the coral cuts his air hose and he drowns. The boat pulls him up, but it will be too late to save him unless he is extremely accomplished at holding his breath. * Captain's Cabin - Colin is most interested in the Captain's cabin where he finds a heavy lock box which needs to be winched to the surface. In it there can be found 22 forty pound silver bars worth $10000 total and a strange, large necklace. The necklace is carved with strange figures of animalistic humans celebrating a great comet with a tail that goes on forever. After a few days investigation, it is clear that the wreck does not contain the riches that Colin hoped for. Colin will be left deeply in debt. However, any characters who invested will double their investment.") "Colin's Ruins" (scenario :name "Colin's Ruins" :summary "* The Ruins - Colin desperately hopes that the treasure fell from the wreck before it landed at the bottom and begins retracing the ship's path. About a 300 yards away, he discovers what probably sank the La Rosaia: a sunken ruin whose stone ceiling lies just below the water line. No treasure is found, but Colin is desperate to find anything of value, so he moves to explore the Ruins. * Temple - The ruin is a stone temple in a bowl shaped depression with curved steps going down 20 feet before entering an archway. The temple itself is only 30 feet across and has many crabs and octopi. The walls are covered by mosaic tile that depicts people suffering during multiple terrible disasters. Above each disaster are tiles depicting an orb with a shining light nearby. * The Pit - In the center of the temple is a dark pit of indeterminate depth. Before the pit is a metal orb on a stone slab. The orb has a metal rod projecting from one side at the end of which is a shiny topaz. The rod can orbit the orb and telescope in or out, but its current position is very close to the orb. A mechanism inside the orb operates the rod and is apparently still active. The pit reaches about 100 feet before a rock cave-in blocks the way. Within the pit is a single, strange dolphin. * The Dolphin - If multiple lights are shined down the pit, a motionless dolphin can be seen. Suddenly, the normally peaceful dolphin swims up and attempts to ram people with incredible force. It will continue attacking unless the invaders leave or it is killed.") "Death of the Father" (scenario :name "Death of the Father" :summary "* Homecoming - As the Palencia arrives at port, police can be seen on the docks. When the Palencia docks, officers rush on board and arrest Colin and Wolff for the murder of Father Garcia. * Murder - Father Garcia was murdered the same day that Colin and the investigators went to the library. Witnesses say that Colin and Wolff returned drunk later that night and ransacked the library. That morning the priest was found in the church with his skull crushed. The reality is that the ghoul cult has been robbing graves for years. Father Garcia has been noticing activity in the night and has been hiding in the church at night to try to catch someone in the act. Unfortunately, he found the graverobbers and confronted them. They immediately killed him and called the Detective to cover up the murder. What the killers did not realize was that Esmerelda was coming home from the speakeasy when she heard a commotion from the church. She rushed over and observed the killers discussing what to do with the Father's body. * Detective Morris Packard - The detective is the head of the police force while the chief is on extended medical leave. He is also a member of a secret death cult that worships ghouls. His cult was graverobbing for their riturals when the Father caught them and he was dispensed with. Colin's drinking made him a convenient scapegoat, so the Detective is constructing circumstantial evidence to arrest Colin. Later he will arrange for Colin to hang himself in jail. If the investigators get too close to the cult, he will arrange an ambush to eliminate them. * Esmerelda - Esmerelda is conspicuously missing. After witnessing the murder scene, she packed her things and fled to her parents house in Clearwater. She fears for her safety and doesn't want to get involved, but when she iscovers that Colin has been frames, she writes a letter with what she saw to the investigators and Colin. * Crime Scene - Trampled in the dirt can be found a pin from the local alligator farm that was dropped in the scuffle. * St. Augustine Library - The local library carries copies of newspapers. Several stories can be found in the Jacksonville Sentinel that may be relevant. Older material is harder to discover. ** 1571 - A yellowed document in Spanish written by Father Rolando Tortulla of Toledo Spain. The document reports to the King, the state of the French heretics held prisoner in vaults below the monastery. They are wild and degenerate and are guilty of cannibalism. They will be held until they die. ** 1641 - A yellowed document in Spanish describes the construction of the Castillo de San Marcos that incorporates the catacombs of the old monastery. A violent french prisoner was transferred to a new cell. ** 1662 - A yellowed document in Spanish describes the horrid state of the French prisoner. His toes are missing and he limps around his cell scratching on the walls saying only gibberish. He will be held until he perishes. ** 1682 - A yellowed document in Spanish describes the escape of the french prisoner. Stones were removed from the wall of the cell and the prisoner fled into a tiny tunnel behind the wall. After a brief attempt to locate him, the tunnel was filled, sealing the fate of the horrible prisoner. Drawings were scratched into the ceiling showing comets and fire raining from the sky. ** 1792 - A religious paphlet describes an ancient evil unloosed by Satan. They are inhuman but walk among us like men. Many officials of the city, both past and present, belong to this secret, godless faith. ** February 1890 - A freshly buried body was stolen from a cemetary south of St. Augustine. No suspects were found. ** May 1927 - Grisly Find at Alligator Farm. Eli Simpson, an employee of the farm, saw a shoe in the large crocodile pool which turned out to also contain a severed human foot. No identification was found, and police theorize that a vagrant snuck onto the farm and fell into the pool. No charges were filed. ** October 1920 - A recently buried body of an indigent was stolen from the old St. Augustine church graveyard. No motive or suspects were found. * St. Augustine Herald - The local paper is a weekly that promotes local businesses and tourist trade. The editor/owner is Fred Boswell who bought the paper 3 years ago. Strangely, the original owners destroyed all their files before they left. * Jacksonville Sentinel - Sold next to the Herald is a real paper published in Jacksonville, a 2 hour drive up the coast.") "Korsky's Alligator Farm" (scenario :name "Korsky's Alligator Farm" :summary "* Eli Simpson - Eli found the severed foot and was subsequently fired by Maynard Korsky for alerting the police before discussing it with him first. It was not the only time he found strange meat in the pens, but it was the only thing he could clearly identify. * Maynard Korsky, Dell Korsky, and Kenny Durham run the farm. They use the gators to destroy the leftovers of the cult, but do not do any other cult business at the farm. * The Farm - If the investigators investigate the farm during the day, the Korskys and Kenny Durham are no help and the cult is alerted to their investigation. If they investigate at night, the farm is not guarded, but the gators have destroyed any evidence that might have been found.") "Castillo de San Marcos" (scenario :name "Castillo de San Marcos" :summary "* A monumental castle started in 1638 and took over a century to complete. The upper levels are open to the public, but the lower levels are considered hazardous and are sealed off with packlocked plywood doors. It is easy enough to pry the plywood loose but not without leaving evidence of tampering. The cells of the degenerate prisoners are easy to locate. The walls and ceiling are covered with scratchings of spiders and comets and skulls. In the final cell, a stone can be removed revealing a low tunnel sloping downard. Crawling on hands and knees for fifty yards reveals a hallway from the original Franciscan monastery that predated the fort. The hall leads to a small room with two chairs and black robes hanging from pegs. The room is the same as the one depicted in the films from Thornton's Camera Shop.") "Thornton Camera Store" (scenario :name "Thornton Camera Store" :summary "* The camera store has a view of the castle. William Thornton works here all day selling cameras, lens, and film. There is also a darkroom where he develops photos. * If the investigators break in they can find some smuggled Cuban ponography and three recent silent films in a locked box. * The Films - Each film is roughly the same depicting a dead body in a chair in a small stone room surrounded by hooded figures. A veiled female figure limps over and begins a ritual. The body seems to gain some semblence of life and then the figures leap upon the body and begin eating it at which point the film ends. * If confronted with the films, Thornton claims he received them by accident along with the Cuban films and that they are obviously some kind of homemade hoax.") "Thornton House" (scenario :name "Thornton House" :summary "* Mother Thornton - Mother Thornton is the matriarch of the death cult and has nearly completely transformed into a ghoul. She never goes out in public and wears a veiled hat even in private. * William will normally be at home after 5pm. During the day, the front door is not locked. If Mother Thornton hears intruders, she will stay in her room pretending to be sleeping in a chair. If she is exposed, she throws off the veil and tries to escape the house. She will leap out the second story window lope down the street scattering the citizenry. Any disturbance here will have the police arrive in five minutes where they will arrest anyone in the Thornton home for the murder of Mother Thornton. Even if she is killed the story will be that they killed a deformed and crippled old woman. * Gray Binding - Among her possessions is a book that teaches the Gray Binding spell that animates a corpse into a mindless zombie.") "St. Augustine Ambush" (scenario :name "St. Augustine Ambush" :summary "* The Note - If the investigators are discovered, Detective Packard will arrange a deadly ambush for them. He will kidnap Eli Simpson, Esmerelda, or anyone else who they think can lure the investigators. The victim leaves a note to the investigators that they have new information and to meet at the church graveyard and night. * The Churchyard - The gator farm truck is hidden to the north of the church, and the Maynards and Packard wait in ambush with pistols and blackjacks behind tombstones. At the center of the graveyard, the contact sits on a tombstone under the moonlight. Unfortunately, the victim is already dead and is merely propped up. The ambushers try to take the investigators alive, but will open fire if they have no other choice. * The Ritual - If the investigators are captured, they are taken to the ritual chamber where one of them is eaten alive while the others watch. Before the grisley feast is complete, a number of ghouls come down the tunnel and tear the cultists apart. The ghouls drag away the dead and ignore the living investigators.") "Exposing the Cult" (scenario :name "Exposing the Cult" :summary "* Exposing the Cult - Since Detective Packard is a cultist, any involvement with local police will get the investigators in trouble. If they can bring hard evidence to the Florida State Police, who will move in and clean up the mess, though they will cover up the messier parts to maintain their vital tourist trade."))) "Investigating the Andamans" (section :name "Investigating the Andamans" :scenariomap (scenariomap "Trip to the Adamans" (scenario :name "Trip to the Adamans" :summary "* The Andaman Islands are a narrow chain of islands 590 miles southeast of India. * Weather - The temperature is mild and ranges from 64F to 92F. Except for October and March, the islands are hit by daily monsoons. * Wildlife - There are no large predatory animals, just all manner of bats, rats, spiders, turtles, wild pigs, and native cats. * Population - The natives are primitive Negritoes, belived to have lived here since the Pleistocene era. Uniquely among modern man, they have no knowledge of fire building and must continually keep a fire burning. They are divided into 12 tribes with different dialects of the same language. They have a long reputation as viscious killers and cannibals. For centuries, shipwrecked sailors had been systematically slain (but not eaten). Over time, the islands have become safe to outsiders except in remote areas. * Port Blair - The British established a penal colony on the islands where convicts are forced to live and work. The colonly is a primitive jungle colony with a dock, general store, a wireless, and faily complete medical facilities. Port Blair is also the only deep water anchorage on the islands, so all ships must dock here. * Major Ashley Nichols - Major Nichols is the commissioner of the Andamans. He oversees the trade of exotic lumber, coffee, cocoa, tea, and coconuts. He also commands a small battalion of Indian solders. Nichols is happy to meet civilized westerners and will places his services and those of the British Government at their disposal. * Arrival - The Andamans are 10,000 miles from America. If the investigators use Colin's ship, the trip takes 3-4 weeks. If they book other passage, they will have to travel to Calcutta first. * Office Records - Major Nichols has nothing to hide and allows full access to the office records where a report of Cynthia Baxter's abduction can be found. In the narrative, it is found that although the abductors initially tried to take her by force, that after a short conversatiion, she agreed to go with them and was returned safely the next day. Major Nichols has only met Cynthia twice, since she rarely comes to Port Blair.") "Trek across the Adamans" (scenario :name "Trek across the Adamans" :summary "* Guides - If they request, Major Nichols will provide two Indian guides to lead them to Cynthia's clinic 45 miles away. However, he does warn that the two are criminals, working off their crimes. Worse, there are 2 escaped criminals known to be in the area. They are desperate killers and could be extremely dangerous. * Sikander - A Hindu in his mid-thirties with a wife and three children on the island. He stole a horse and has served eight years so far but is mostly trustworthy. He will, however, steal a weapon for protecting his family if he gets the chance. If successful, he will hide the weapon in the jungle for future retrieval. * Mahbub - A Moslem from Delhi who has served twenty years so far for murder. He speaks little English and is neither garrulous nor energetic. * The Jungle - The trip to Cynthia's clinic starts on timber roads, then footpaths, but before the first day is over they are struggling through thick growths and shallow swamps with no path. The trip takes three days or more, and the guides prove able servants, doing all the work of setting up camp, building a fire, and preparing meals. * The Villiage - A loud buzzing noise emanates from a clearing ahead with a tiny, abandoned villiage. The buzzing comes from a tree with a crude platform 25 feet up. Atop the platform is a rotted human form covered in a mass of undulating insects that are devouring it. Although the Andamanese normally bury their dead, if a particularly revered chief dies, he is bundled in a tree and the clan abandons their villiage for three months in reverence. If the body is disturbed, the Jarawan hunters will track the intruders and attempt to kill them for their blasphemy. * The Mission - Cynthia has a small wooden building that serves as her clinic surrounded by the huts of 20 Andamanese. Nearly a mile from the beach can be seen a 6 mile island covered with dense jungle. If local tribesman believe the island is evil, and only Cynthia has returned alive from it. The inhabitants of the island rarely leave, and when they do it is only to kidnap and kill. * Cynthia Baxter - Cynthia is a large woman, big-boned and slightly overweight. She is very near-sighted, and her voice is high pitched and squeaky. Cynthia will act hospitable to strangers, but she is highly suspiscious of those who would appear at this critical moment in her life. She lost her mother at 8 year old. She nearly died from a spider bite and 12 and began thinking of becoming a catholic nun. Instead, with the encouragement of Uncle Julian, she studied medicine in college. Julian helped her get through medical school, and she is deeply grateful to him. To impress Julian, she became a medical missionary and travelled to the Adamans in 1913. In 1918, she was kidnapped by the Tcho-Tchos from the small island across the strait. The Tcho-Tcho priest saw the mark of the spider on her, and trained her in the nature of Atlach-Nacha, their horrible spider god. Cynthia never had a strong personality and was easily brainwashed and converted to the terrible worship. The priest has convinced her that she has a special detiny (which is horribly true), and now only Julian might be able to turn her from her path. * Cynthia's Journal - In her hut is a journal that describes her facination with the teachings of the Tcho-Tcho priest and her belief that a new sun shall appear in the sky. The journal describes the arrival of Silas Patterson and his interest in the Tcho-Tcho rituals. She also writes of her mixed feeling about sending the 'present' to her father, but the priest insists that he cannot be allowed to interfere.") "Tcho Tcho Island" (scenario :name "Tcho Tcho Island" :summary "* Kidnapping - The arrival of strangers, convinces the priest that the moment has come. He sends men in the night to meet with Cynthia, and she eagarly goes with them. The local Adamanese raise an alarm and many flickering torch lights can be seen from the island. * Tcho Tcho Tribesman - The Tcho Tcho are more asian in appearance than the average Adaman. They are all violent fanatics and will hunt down and capture anyone who invades their island. There are 10 males, 6 females, and 3 children on the island. * Tcho Tcho Priest - The Tcho Tcho priest leads his tribe. He is a long time explorer in the Dreamlands and there he has the form of a twisted dwarf (reflecting his personality). In combat, the priest stands back and casts spells (Dread Curse of Azathoth and Withered Limb) while his comrades fight and die. * Fossil Quarry - An exposed rock in the jungle is covered with fossils of prehistoric arthopods including millipedes, scorpions, and spiders. This rock is the source of the spider from the Baxter home, brought to life by the Child of Atlach-Nacha spell cast by the Tcho Tcho priest. A single enormous spider six-feet across can be found here, and the priest will animate this spider if he gets the chance. Note: Any damaged fossil cannot be reanimated. * Obelisk - In a clearing near the villiage rises a black stone, twenty foot monolith. Though weathered by time, precise geometric designs are clearly visible. These designs are are disturbing to the eye and create a sense of vertigo. Out of the corner of one's eye, they seem to swirl and pulse. If one listens to the stone an almost impercetible rhythmic throbbing can be heard. Crude stones are set up around the obelisk covered in primitive drawings of spiders chasing and consuming tiny humans as shooting stars fall from the heavens. * Metamorphosis - On the night Cynthia is 'kidnapped', she goes directly to the Obelisk. There the tribesmen have gathered to begin the ceremony. Near the Obelisk are bound the 2 escaped killers that Major Nichols warned of as well as any other captured males. Cynthia stands before the altar, removes her clothes and sways to the Tcho Tcho songs. Eventually, she stops, bends over, and the skin along her back splits wide open, revealing a shiny black surface that pulses horribly. As the wrinkling empty skin of Cynthia Baxter is pushed forward, multple legs spill out from the discarded molt, waving feebly, as the huge spider-thing pushes clear. The priest dones Cynthia's discarded skin and wears it like a coat. * The Wedding Feast - Cynthia's new form is not hard enough to move freely until dawn. In the meantime, she is ceremonially wedded to the male sacrifices before she drags herself to each one and begins eating the flesh from the victims head. She finally sucks the brains out through the eyesockets. Each feast takes 20 minutes, and after each is consumed, the still animate corpses with exposed skulls are freed and shamble mindlessly off into the forest. The Onge people sense the threat of the Tcho Tcho and attack the Tcho Tcho. The Tcho Tcho defend Cynthia and the priest as they escape. The Onge will not pursue the Tcho Tcho into jungle at night. Instead the free any remaining prisoners and wait for light. The priest makes his way to the prehistoric rock and casts Child of Atlach-Nacha to animate the giant spider there. * Daughter of Atlach-Nacha - At dawn, Cynthia is fully formed and begins a 3 hour trek across the island to the Caverns of Atlach-Nacha. She is accompanied by hordes of spiders that crawl around and over her. Any who follow will constantly be treading on spiders and have spiders dropping upon them from the trees. Their bites are painful but are not dangerous. * Caverns of Atlach-Nacha - Cynthia travels to a 20 foot cave opening where her father dwells. If she is pursued, she will wait in ambush for her pursuers. If the investigators are foolish enough to continue searching, they will travel through twisting caverns deeper and deeper for over an hour before the cave opens into a vast chasm nearly filled with thick, ropy webs. Continued activity attracts [Atlach-Nacha] himself who resembles a hideous, black, hairy spider with a strange, remotely human-like face with little red, hair-rimmed eyes."))) "Ulthar and Beyond" (section :name "Ulthar and Beyond" :scenariomap (scenariomap "Exploring Ultar" (scenario :name "Exploring Ultar" :summary "* Phillip Baxter's dream journal leads the investigators to start exploring [Ulthar] in the Dreamlands. * Phillip's Dreamform - At some point someone will notice that Phillip Baxter is watching them from a distance. If anyone approaches, his head disappears in a cloud of mist and then he vanishes. * Procession of Burgomaster Kranon - Trumpets announce a parade throught the streets for Burgomaster Kranon. The Burgomaster is immediately recognizable as Matthew, Julian Baxter's ward. In the Dreamlands, his emotional and mental handicaps don't exist. If the investigators can get an audience, Krannon can be convinced to help them, both here and in the real world. * Cthaat Aquadingen - At the [Library at Ultar], the investigators can search for the [Cthaat Aquadingen]. The book is bound in soft, human skin, still pliable, and always moist from perspiration welling from its pores. Simply handling the book is creepy. Within the book can be found a quote: The stars fall, the beast bred of stone rampages, and a time of great change comes. Deep within perfumed Kled, where life turns to death, the Watcher in the Glade knows the time and place of the coming. Chinese notes are written in the margin of the page. If they are translated, they comment that the Pnankotic Manuscripts mentions the Watcher in the Glade. * Pnakotic Manuscripts - If read, the manuscripts describe that the Watcher in the Glade is the Great Old One Yibb-Tstil. Priests of Yibb-Tstil meet at the great pool in front of the ivory palace. Priests then grovel on hands and knees before Yibb-Tstil and must not look upon him. priests of * Carnival - While leaving Ultar, the dreamers chance upon a carnival tent. A barker announces that they have the only captive Colossal purple spider from the distant north. Admission is a dime or anything of value. The interior of the tent is larger than the outside would suggest, and in a barred cage at the back of the tent is a purple spider the size of a car hovering over the dessicated body of a sheep. If anyone tries to talk to the spider, it speaks in a thin, dry voice. It is, however, not helpful and eventually hisses. The barker comes running in and ushers them out. If they want to speak more, the barker says: 'It is not up to me you see'. The spider then says: 'After all, I am the master here.' If the barker is questioned about the dwarf who works here, he tells them the dwarf quit some time ago and headed to Kled.") "Journey to Kled" (scenario :name "Journey to Kled" :summary "* The perfumed Jungle of Kled can be reached by traveling North from the Enchanted Wood to Thran. At Thran a elephant caravan can be taken over land or a river boat can be taken to Hlanith where passage on a ship can be found to Kled. * Numerous ivory palaces dot the jungles. If the dreamers ask about the great pool mentioned in the Pnakotic Manuscripts, the guides recognize it as the Palace of the Sacred Fount. * Palace of the Sacred Fount - The palaces is one of the less feared locations, though it is still avoided. As with other ivory palaces in Kled, the palace is somehow physically in perfect condition though the rooms are empty and the floors are thick with dirt and leaves. The smell in the area is a unique musky odor that immediately reminds the dreamers of the smell during the dream of the death of Phillip Baxter. The front hallway is an atrium where rain water falls to collect in a rectangular pool. At the far end of the pool stands a huge jade statue of an evil-looking hyena. The statue leers with gaping jaws over the pool. The apparently bottomless pool is dark and filthly from rotting leaves, a peculiar oily film covers its surface. Despite its appearance the pool is not dangerous. * Phillip's Ghost - A distant cackling sound can be heard. Following the sound, the dreamers find a stairway going down many flights with torchlight below. At the bottom of the stairs, the dreamers find a torchlit hallway with a cell at the end. Within a cackling dwarf uses a human femur to visciously beat a glowing, partially headless, staggering figure. The dwarf is hunched and misshapen and has a terrible, inhuman face. Its lips are drawn into a snarl over three-inch fangs. Its eyes are glowing red pits. The figure is the dreamform of Phillip Baxter. If he is rescued, his headless form is mindless and helpless. The dwarf with not help under any circumstances. * Path to Yib-Tstll - Behind the Palace the jungle becomes stunted and twisted, tree trunks are bent at odd angles, and a general sense of disease pervades the growth. Futher on, alien foliage begins to appear including quivering fungi and twisting weird ferns. Further still, a great stone arch can be seen surrounded by dead trees. Through the arch can be seen another alien jungle evidently on a far-off world. The arch is clearly a permanent gate, and plants and insects can be seen crossing both ways as if the arch were simple stone. * World of Yib-Tstll - Beyond the arch, the sky is dark green and starless. Swollen insects swoop ominously from deadly-looking blooms. Flying horrors with veinous wings fly high above. Not far away, a vast, black clearing is visible. * The Clearing - The clearing is roughly a mile across. The black surface is composed of fine flakes like snow, but it is warm to the touch. If the dreamers heed the Pnakotic Manuscripts, they should crawl on hands and knees across the black clearing facing the ground to avoid actually seeing Yibb-Tstll. As the dreamers near the center, Yib-Tstll rises suddenly from the black clearing. Dreamers may attempt to avert their gaze or suffer the madness induced by his presence. * [Yibb-Tstll] - The massive being speaks telepathically with a booming alien voice. Each dreamer must make a [Spirit] test or Yibb-Tstll will ignore that person completely. If the test is completely failed, Yibb-Tstll will touch the person and impart its feared reversal. Yibb-Tstll is suprisingly helpful and will answer questions about the Cthulhu Mythos and things of cosmic import including Nemesis, but he will only give a single answer on a subject and will not clarify himself. * Reversals - Any dreamer who suffers a reversal will instantly be driven insane or his human form or dream form will be permanently killed. If an insane dreamer is brought to him, Yibb-Tstll will fully restore his sanity. If the dwarf is present, Yibb-Tstll will reverse him, and his dream form will change into the Tcho-Tcho priest while his real form will become the dwarf. If the headless form and the ghoul's page are brought before him, he touches them both and Phillip Baxter's dream fomr is restored, but back in the real world, Silas Patterson has become a mad imitation of Phillip Baxter. * Web of Eibon - Yibb-Tstll instructed Eibon in his construction of the Web of Eibon spell with which he planned to freeze time around Nemesis (and Earth) to prevent Earth's destruction. Yibb-Tstll knows his efforts will fail in the end, but it provided the instructions anyway.") "The Quest of Ghouls" (scenario :name "The Quest of Ghouls" :summary "* Ghoul Dream - After the events at St. Augustine and the Dreamlands, one night the investigators find themselves having hazy dreams of the graveyard at St. Augustine. Suddenly, the dream sharpens and 3 figures start crawling from an open grave: ghouls like the ones that may have been seen at St. Augustine. The ghouls stinking breath reeks of death and decay. The ghouls do not appear to be hostile, instead they start urging the investigators to come with them to see the wise man and there is little time left before dawn. A terrific stench issues from the open grave. Below rotten bits of wood and fabric lie on the grave floor and a narrow, twisting tunnel leads into darkness. The ghouls gibber that they must hurry and start climbing down the hole. If the dreamers don't follow the tunnel begins to slowly close. If the dreamers still do not follow, they awake normally, but the opportunity to learn more has been lost. If they do follow, the tunnel collapses behind them and they will have to follow the ghouls forward. * Grath the Leader - Young and handsome by ghoul standards, Grath leads the group and most often speaks with the dreamers. He had a riding zebra, but the group got hungry and ate most of it. * Mairpl the Big - Mairpl is much larger than the others, speaks little, and wields a club in battle. * Ug the Hungry - The worst and most degenerate of them, Ug speak no human language and spends most of his time on four legs. He avoids the humans, but can often be seen staring and drooling over them. He possess no threat, but he likes to fantasize. * The Page - At the end of the tunnel waits the Page. The Page is wrapped in a dirty brown cloak with his face hidden. His body is bent forward and staggers under the weight of an enormous tombstone chained to his back. The ghouls order the Page around and play viscious practical jokes on him. Below the hood can be found Sila Patterson's face, though it shows no recognition. Upon the tombstone is written 'Phillip A. Baxter 1865-1925.' The Page is, of course, the dream form of Silas Patterson, suffering from the guilt of the death of his friend. * The Quest - The ghoul gang seeks to rescue a female ghoul Horella who has disappeared. The ghouls are fairly melodramatic about how beautiful she is and how they must rescue her from whatever peril she is in. To find Horella, they seek the insight of the wise Man of the Mountain. This man supposedly is very wise and will answer any questions. * Social Ettiquette - After a few hours of travel, the ghouls stop for nourishment. They squat down and rummage through their stained sacks. They produce vaguely familiar cuts of raw meat with tinges of green along with sour wine. The source of the meat is all too obvious. The ghouls like their food well-aged and, out of respect, offer their guests the oldest pieces. The bags also contain the remains of Grath's zebra which the ghouls are more than happy to hand over, leaving the tastier pieces for themselves.") "Journey to the Stony Desert" (scenario :name "Journey to the Stony Desert" :summary "* The Underworld - The ghoul tunnel leads to the Underworld. Once in the Underworld, the tunnel leads upward for 3 days through the center of a huge mountain. Many ohter tunnels branch off, but the ghouls seem to know their way. Drinking water oozes down the rock wall. Bloated fungi, pale, foot-long crickets, and eyeless carnivorous rats server as food. Most of the trip is in complete darkness. Occasionally, luminescent fungi provide a tiny amount of light. The tunnels connect the Vaults of Zin where dangerous ghasts, serpent folk, or worse may be encountered. Eventually, the group exits the Underworld at the border of the [Stony Desert]. * [Stony Desert] - Grath says the journey eastward across the desert will only take a few days. They seek the sacred mountain [Mt. Hatheg-Kla] where a holy man can tell them where fair Horella can be found. * Walker of the Stony Desert - A few days journey into the desert, the dreamers see, off in the distance, a man leading a horse. They will meet in about an hour. As they draw near, it is clear that the man is enormous, towering over the horse. He is 8 feet tall, 400 lbs, and dressed all in black. His horse seems old and tired and lags behind being pulled by a rope. The horse is an elderly nag with cataract films covering both eyes. The ghouls are terrified of the man and will not approach. He does not stop walking unless he is attacked. This being is the dream-form of Eibon. the Hyperborean wizard who, like the spell he cast to capture Eibon is bound to travel back and forth across the Stony Desert. A legend says that one day he shall find a way out of the desert. On that day, the horse shall be healthy and the man shall then ride the horse. Where he goes then, he does not know for the horse shall be the master. He freely discusses his trip across the desert, Mythos knowledge, Nemesis, and his spell the Web of Eibon that Yibb-Tstl taught him. He now knows that stagnation is worse than destruction by Nemesis. If asked about Nemesis, he produces a large, shining jewel from the air and offers it to the dreamers. He says simply that all brave souls will know what to do when the time comes. Any attempt to attack Eibon results in him disappearing and reappearing far in the distance continuing his endless travels.") "The Man on the Mountain" (scenario :name "The Man on the Mountain" :summary "* [Hatheg-Kla] - A day or two after meeting the Walker, the slabs become more numerous. As they approach Mt. Hatheg-Kla, smoe of the slabs are still turned upright in the ground and bear traces of ancient carvings. Soon it becomes obvious that they are travelling in a titanic graveyard. * Climbing Hatheg-Kla - Mairpl assures them that this is the only way to see the holy man and ask where Horella is being kept. The other ghouls will wait here while Mairpl and any brave dreamers attempt the climb. The way up seems somewhat trecherous and will require a [Climb] roll to succeed. If that roll fails, a second [Climb] roll must be made to catch yourself before you fall to your doom. Unfortunately, Mairpl fails both rolls and falls far below splattering on the rocks and potentially injuring those below. After a short period of remorse, Grath and Ug gather some of the larger pieces and add them to their provision bags. * The Man on the Mountain - Near the skull tree, an old, bearded man in a yellow robe sits on a heap of corpses plundered from the cemetary below. He deftly uses a silver hatchet to cut pieces of the corpses and flings the dripping gobbets above his head as the circling Byakhees swoop down to catch them from the air. As the dreamers approach, the Byakhee scream and chatter, but the man pays them no mind. If hailed, he smiles warmly, and if asked questions he will honestly answer based on his vast knowledge of the Dreamlands and the Mythos. Knowledge comes at a price, so before he answers each question, he hurls his hatchet at the questioner which instantly slices off an appendage, starting with a hand. The Byakhee swoop down and eat the tidbit. The wound does not bleed and only hurts for a moment. The damage is permanent in the Dreamlands, but each time a dreamer returns to the Dreamlands one wound is healed. If asked, he tells that Horella is at the castle of Bombel, the giant, in the hills to the east of the [Stony Desert]. Anyone foolish enough to attach the man, is attacked by the Byakhee, rended to pieces, and eaten. * Cave of the Child God - Behind the tree, the shear face of Hatheg-Kla rises another 1000 feet before the cave entrance. A flight of steps, each one foot wide, criss-crosses back and forth up the slope. Anyone nearing the opening hears a deep sobbing and suckling sound as if from some enormous infant. The cave itself is completely black and no light will penetrate it. If anyone enters, a few seconds later, horrifying screams of agony echo from the cave accompanied by sucking, popping sounds and a soft, cooing voice. The screams continue for almost a minute before they are choked off by a gurgling, bubbling sound and a huge spray of blood that shoots from the cave. The character's dream-self is dead, and his waking self has been driven mad by the horrific dreamform of Nemesis.") "Castle of Bombel" (scenario :name "Castle of Bombel" :summary "* To the Castle - The Man on the Mountain has directed the dreamers toward a castle to the east of the [Stony Desert]. The trip takes a few days through the desert and another day throught wooded hills. * The Castle - The rude, three-story castle is in a clearing. It has a single window at the top and a door at the bottom. * Bombel - Near the castle, sitting on a boulder is a huge [Gug]. At the first sign of intruders, it rushes to the attack. * Horella - Shortly after Bombel starts fighting, a foul-looking, scaly ghoul appears in the window. This is Horella, and she immediately begins hurling vile insults and rocks at the Gug. The ghouls are cheered on by her presence, but if someone listens they realize that she is exhorting Bombel to kill the intruders. Dreamers may also notice previous bruises on Bombel's head. If Bombel falls, Horella turns her insults and rocks at her would-be rescuers. Any remaining ghouls grab a chain from their bags, say 'To the rescue', capture Horella, and drag her bumping down the stairs. The ghouls bid farewell and will offer the page as a reward for the dreamers help."))) "Nemesis: Spawn of Azathoth" (section :name "Nemesis: Spawn of Azathoth" :scenariomap (scenariomap "Trip to Darjeeling" (scenario :name "Trip to Darjeeling" :summary "* Francis Wilson - Francis is one of the Tuesday Night Academy. He was at Phillip's funeral and he has been in Russia researching the Tunguska Blast and its possible relationship to Nemesis. He has made some discoveries and sends a telegram to Judge Braddock who forwards it along. The message says to leave immediately for Darjeeling, India and to meet Colonel Hugh Huntley of the British Foreign Office. * Darjeeling - * Colonel Hugh Huntley - Francis has arranged with the British Foreign Office to allow the investigators to travel to Lhasa, Tibet to aid him in his research. Colonel Huntley provides them with papers and can help arrange transport to the British Legation in Lhasa where Francis Wilson is staying. * Road to Lhasa - The 400 mile journey to Lhasa can only be taken on foot or via horse-drawn caravan. The route is heavily trafficked by pilgrims, traders, smugglers, and spies. The journey takes weeks and is alternately terrifying, boring, facinating, cold, and misery-making. * Lhasa - Lhasa is a sprawling squat city with no building taller than 2 stories except for the Potala, the home of the Dalai Lama. The Potala is a bulky, stone structure that is imposing but unattractive. * The British Legation - The Legation is on the outskirts of Lhasa. Here Francis Wilson has residence. He seems thinner and more stressed than at the funeral. He has been researching the Tunguska Blast and mad Rasputin's apparent presence at the blast. After piecing together his research, he illegally entered the Soviet Union and stole parts of Rasputin's journal. He then fled to Tibet through Mongolia. He has been translating sections since then. He claims that Rasputin met someone called Eibon in his dreams, and that this Eibon told him of his own death. Eibon also warned him of a dark star that would fall from the sky. This Eibon gave him a stone that he used to destoy the star. He further foretells another dark star that would fall long after Rasputin's death in Tibet. Francis guesses that the location may be near an abandoned temple roughly 300 miles north of Lhasa. He has found a guide Lha-bzang who studied in the temple as a child. * Lha-bzang - Francis plans to travel there soon with a native Tibetan, Lha-bzang. Lha-bzang is a domden, a Tibetan mortician. A skilled Anthropologist may recall that Tibetan funeral rites involve the corpse being hacked to bits by the axe-wielding domden and then fed to ravens or vultures. Lha-bzang's dream form is the holy man on the mountain. Lha-bzang is going on the journey to expand his spiritual understanding. Unfortunately, he has also been paid off by a Soviet spy. If questioned about the temple, he says he was sold as a slave as a child but he fled the temple when he realized that their teachings were not Buddhist. * Ivan Dorkyev - A Soviet spy who has been tracking Francis down since Francis stole Rasputin's journal in Leningrad. He is over 6 feet tall and is dressed in the tattered robes of a yak-herder. Beneath, he carries two pistols, a knife, and a bandolier of ammo. He hides at his camp in the mountains near the ruins waiting for Lha-bzang to bring Francis. * Trip to the Ruins - Lha-bzang leads the expedition 300 miles through a tangle of steep mountain passes, brackish lakes, and arid valleys. On the way, they encounter kay-herders, small mountain monasteries, and moutain farms. About 2 weeks in to the trip, while camped, a minor earth tremor shakes everyone awake. A week laker, they arrive at the Nenmka temple, sitting on the slope of a mountain. * The Temple - The temple is now just a windswept ruin. A Mythos knowledge test reveals that the fallen columns have inscriptions used to invoke Hastur. The Soviet spy has watched the investigators approach and waits in hiding nearby. Lha-bzang finds a section of flooring with symbols on a tile. Here he will perform a ceremony to discover more about Nemesis. * The Ceremony - Lha-bzang sits and lights a clay pipe containing a tarball of hashish. He passes the pipe around and then begins a droning wail. After 30 minutes, he retrieves a knife and a freshly severed human hand from his bag. He cuts his own palm, smears blood on the hand, and binds the cut. He then passes the knife to each person to do the same. If any will not, he gestures for them to leave the prayer circle. After another 5 minutes, the hand twitches and then turns toward Lha-bzang. He asks where can they find the Seed of Nemesis. The hand then crawls to a symbols on the ground indicating 'not far' and 'north-east'. Additional questions may be asked but each question causes the questioner to receive a minor Sanity Wound. Answers are always very short, and the hand only knows local events. The Soviet spy waits nearby but has accepted Lha-bzang's demand to allow the ceremony to complete before acting. * Confrontation - Just as the ceremony is concluded, Ivan steps into the room brandishing his pistols and warning everyone to stay where they are. He is deadly serious and will gun down anyone who makes sudden movements. Ivan plans to take Francis back to the Soviet Union to stand trial for the many laws he has broken and suspiscion of being a spy. He has no knowledge of Nemesis and has nothing but contempt for the superstitious, religious ritual. If given the chance, he will tie up the investigators and then take Francis and Lha-bzang (his ally) in the morning. * The Fallen Seed - In the early morning, everything changes. Along with the bright sun, a halo forms in the sky, though this halo does not surround anything visible, yet. Dorkyev is thunder-struck; he and Francis exchange words in Russian. Ever the pragmatist, Dorkyev frees everyone and begins a descent toward the valley under the halo. Within the valley, the halo light is flat and oily, and its color melts through shades of yellow and green as though through a prism. Lha-bzang vomits and flees. Suddenly, all present feel their hair stand on end as the halo darkens and takes on a dull gun-metal hue. The slight wind disappears and everything is silent. Then, high above a sizzling sound grows in intensity. Suddenly a hideous scream is heard followed by a thunderous blast that knocks everyone off their feet. Everyone suffer partial hearing loss and if a check versus [Body] is completely failed, the loss is permanent. A blinding light rips through the sky and crashes to Earth over the valley ridge that Lha-bzang crossed. A massive explosion rocks the ground and a curtain of flame passes overhead. If not for the ridge, everyone would have been incinerated along with Lha-bzang. * Crater - Peeking over the ridge, a 20 foot crater can be seen with a sickly, green light emanating from it. Wilson frantically says that Eibon's symbol must be placed on the Seed or it will destroy the Earth. Those who have witnessed the Seed in Montana know that any who approach the Seed will die: quickly or slowly. If no one volunteers and no one has a plan, Dorkyev swears, snears of their cowardice, and takes the jewel to the crater. Alas, just as he climbs the crater and is exposed to the light, he screams and immediately melts into a puddle before everyone's horrified sight. Worse, he drops the jewel into the crater. If someone uses a mirror, they can see the jewel near the Seed which is slowly melting the rock around it with its terrible power. Wilson adamantly refuses to go (and will melt if pushed), so someone will have to sacrifice themself or watch the Seed sink into the ground and doom the world. * Eye to Azathoh - The doomed person must resist the corrupting rays, retrieve the jewel, and then touch it to the Seed. Nothing happens for a few moments, then the Seed suddenly shimmers and disappers with a sharp pop. The Seed is gone but a black, marble tunnel lies in its place. The jewel lies on the ground before the tunnel. Hyperborean symbols line the tunnel. This is Eibon's work. When the jewel crosses the threshold, it suddenly reverts to the heavy glowing stone from the Dreamlands. There is a steady breeze down the tunnel and a light can be seen ahead. After 100 meters, a room 250 meter, circular opens up. The room is the exact same shape as the jewel. The breeze has become a howling gale ending in a 5 meter gateway in the center of the other end of the room. The gateway in the center of the oval room gives the impression of an eye looking out into space. * Gateway - The gateway can be reached by a ramp that slopes upward 50 meters. Stars can clearly be seen through the opening, and it is clear that the gate leads directly into outer space. Anyone who has been exposed to the Seed radiance, has an intense desire to go through the gate and join Nemesis. Anyone approaching the gate will need ropes or climbing skill to cling to the reliefs on the floor or be sucked into oblivion. Also, the jewel gains weight as it approaches the gate, as if it is resisting, eventually becoming over 100lbs. If someone can get close or has binoculars, that person will see that the area of space beyond the portal is filled with criss-crossing black lines forming a faint web. Someone may recognize the black substance and The Black associated with Yibb-Tsll. This is Eibon's Web taught to him by Yibb-Tsll. Within the web, an observers intuitively senses that time is slowing to a crawl. Further, the web is creeping through the portal into our world. This is how mad Eibon hoped to save mankind, by freezing us forever in time, so Nemesis can never destroy us. * The End - If the jewel is brought near the gate, in addition to its increased weight, the Black lines start to reach toward the jewel. Simply hurling the jewel through the portal will gather all the webs onto the jewel which breaks the spell of Eibon. If anyone returns to the Stony Desert, they will no longer find Eibon there. The world will no longer be trapped forever in frozen time, but Nemesis will still return some day to end the world, but it will not be today.")))) :unitmap (unitmap "Julian Baxter" (unit :name "Julian Baxter" :summary "* Julian Baxter is a priest and brother of Phillip Baxter. He is confined to a wheelchair and is heavily dependent on his son Matthew. Before becoming a priest, Julian was educated as a psychotherapist. He has traveled the world on missions, but since becoming crippled he has returned to his home town. * Julian has a copy of the Book of Eibon in his library. It has a section where Eibon fortells the end of mankind with the coming of Nemesis. Eibon was obcessed with preventing man's destruction and spent the rest of his life developing a ritual call the Web of Fate that would supposedly save mankind when the time was right. Eibon claims that as Nemesis approaches, the Web of Fate will draw together seemingly unrelated events, defeat Nemesis, and create an eternal golden age for mankind. The reading clearly shows Eibon's progressive descent into madness.") "Matthew Baxter" (unit :name "Matthew Baxter" :summary "* Matthew is the adopted, grown son of Julian Baxter. He is strong, but he is also mute and aeuteistic. This combination makes him appear simple, but he is actually quite competent. He is an avid dreamer where there is no trace of his aeutism. In dreams he is a city council member in Ultar. He can be a strong ally, but he must be approached in the Dreamlands, as it is impossible to gain his friendship in the real world.") "Silas Patterson" (unit :name "Silas Patterson" :summary "* Silas is a friend of both Phillip and Julian Baxter, a past professor at Brown University, a former antrhopologist, and a member of the Tuesday Night Academy. He is quite fit considering his age. * Silas met Julian Baxter in the Congo in 1904 and became friends. In 1919, he met Cynthia Baxter, Julian's niece in the Andaman Islands. In 1920, he came to Providence where he met Phillip and joined the Tuesday Night Academy. Phillip soon after helped him get a teaching position at Brown. * Silas practices a form of cannibalism he learned in New Guinea at the instruction of a degenerate Tcho-Tcho priest. The ceremony involves eating the brains of a recently slain primate to gain extended life. This habit made him lose his job at Brown when it was discovered that he was stealing monkey corpse from the lab. He has since made an arrangement with a local undertaker with low moral character, Alvin Beswick. Silas told Beswick that he was performing brain research, but Beswick is just concerned with the money. Beswick allows him access to closed coffin corpses for a price. He was given access to Phillip's corpse and noticed the small bite marks on the scalp. While devouring the brain, Phillip suddenly lurched back to consciousness and thrased wilding before dying. Silas was terrified and is wracked with guilt over his friend's death. He is maintaining his sanity through denial, and if he is forced to confront what he has done, he will retreat inward and become catatonic and need to be institutionalized. * Silas is friendly, but he not only knows his role in Phillip's death but is reasonably sure that Cynthia was involved. He is planning to return to the Andaman Islands to investigate Cynthia's activities and also because it is getting hard to hide his youth in Providence. * In Sila's desk can be found notes for his next book, about cannibalism. The notes indicate that Silas is unbalanaced. In his files can be found the lease to a farmhouse. * Investigating the farmhouse, leads to the table where Phillip met his end. No attempt has been mde to cover up the crime."))))))) "Kingdom of the Gods" (chapter :name "Kingdom of the Gods" :sectionmap (sectionmap "Kingdom Undead" (section :name "Kingdom Undead" :itemmap (itemmap "Resurrection Herb" (item :name "Resurrection Herb" :summary "* This rare herb is believed to return the dead to life. Actually, it is the tiny worm eggs that grow on the plant that infect the host and turn them into a zombie. * Infection - The worms can infect a living host if worms, their eggs, or infected flesh are eaten (even cooking is not a guarantee of safety) or the worms transfer via an ghoul bite. A recently deceased host may also be infected if the eggs are injected directly into the brain. * Transformation - Once infected the worms rapidly multiply by division and move through the body. Once fully infected, the worms act as replacement nervous system, stimulating the cells and retarding cell death. The worms stimulate the primitive sections of the brain to cause it to seek more hosts for the worms. The When they first activate the body, its movements are jerky and extreme, but the body quickly adapts and becomes quite agile over time. * Pack - The worms are a colony creature and are aware of nearby worms in infected creatures. They, therefore, do not attack other infecteds and tend to collect together in groups. * Intelligence Level - Though they are savagely murderous and largely fearless, they do retain an animalistic survival instinct and take shelter and avoid fire and heat which would kill their worms.")) :unitmap (unitmap "Kingdom Ghoul" (unit :name "Kingdom Ghoul" :summary "* Strengths: ** Agility and endurance: In some scenes, they were able to bring down a full-size horse and nearly match the speed of one for short, sustained periods of time. ** Short incubation period: It takes about 15 seconds to 1 minute for a victim to turn into an undead zombie. Making them effectively at multiplying and overwhelming urban centres. However, this can vary. One main character was able to resist the infection for over 2 minutes. ** Durability: It has been observed that even if their internal organs are exposed or took a direct stab from a sword to their chest, this doesn't kill them. ** Heightened sense of smell: A fresh drop of blood from an uninfected human can attract other infected bodies many meters away. * Weakness: ** Decapitation: They're capable of taking damage that would be fatal to most men. It was found that decapitation or destruction of the head is the most effective in killing them. ** Aversion to water bodies: It has been observed they will generally avoid travelling on water bodies. They have no ability to swim, and when they are pushed into deeper waters, they will immediately sink to the bottom. ** Heat: They have been observed to immediately seek shelter when the day begins to break in order to escape the heat of direct sunlight. As a result, during spring or summer, they are only active during the day and hibernate at night. ** Fire: Fire can be used to keep infected at bay. ** Reduced vision: The milky eyes limits their vision to basic movements, so they rely on smell and hearing to hunt. ** Blood: Blood can be used to distract or bait the zombies to behave in certain ways. Although dangerous, using fresh blood on rooftops is shown to be an effective means to lure zombies if needed."))))) "Night of the Living Dead" (chapter :name "Night of the Living Dead") "Serial Killers" (chapter :name "Serial Killers" :sectionmap (sectionmap "Unstoppable Killer" (section :name "Unstoppable Killer" :reference "* Friday the 13th, Nightmare on Elm Street"))) "Deadly Beasts" (chapter :name "Deadly Beasts" :reference "* Jaws, Phase IV, Them"))))
nx/tactics/books/horror / tacticsbook
Description:
Function Name:
  • tacticsbook
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func tacticsbook : base/book (book :name "Horror" :image "Cthulhu.jpg" :chaptermap (chaptermap "Horror Overview" (chapter :name "Horror Overview" :sectionmap (sectionmap "Why Tactics: Horror?" (section :name "Why Tactics: Horror?"))) "Call of Cthulhu" (chapter :name "Call of Cthulhu" :reference "* Premise that common human laws and interests and emotions have no validity or significance in the vast cosmos-at-large... To achieve the essence of real externality, whether of space or time or dimension, one must forget that such things as organic life, good and evil, love and hate, and all such local attributes of a negligible and temporary race called mankind, have any existence at all." :summary "* Most of the intelligent Mythos creatures are masters of [Necromancy] and have long ago reanimated their physical bodies into part physical/part spiritual forms that humans would call [Undead]. * Like [Undead], they exist partially in the [Spirit Realm], are immune to most hostile environments, and appear blurry in photograph and other recordings. * If their body is destroyed, their Spirit leaves the body and enters the [Spirit Realm] fully. Their bodies age will rapidly catch up to it usually causing it to deteriorate rapidly. Normally their spirit never returns to the physical world, but if they are powerful enough, they may find their way back through the Veil and even death may not stop them from returning." :sectionmap (sectionmap "Seeds of Azathoth" (section :name "Seeds of Azathoth" :summary "* Nemesis - Since 1984, a theory attempts to explain the mass extinctions that occur every 27 million years. The theory submits that a brown dwarf star orbits our sun at 95,000 AUs and every 27 million years it approaches close enough to rain comets throughout the solar system causing climate change, mass-extinctions, and similar catastrophes. * Seeds of Azathoth - Nemesis is, in reality, a Spawn of Azathoth that has clung to orbit around the Sun. Occasionally, pieces of Nemesis break free, falling into the solar system: the Seeds of Azathoth. Seeds that strike the Sun are destroyed, but if a seed strikes a planet, it can melt into the planet's core where it grows immensely, eventually forming a new Spawn which emerges from the broken planet like a snake from an egg. Our system's original fifth world was so parasitized. Its remnants compose the asteroid belt. * For millenia, human and other astronomers have seen in comets, 'hairy stars', approaching disaster and ill-fortune. In ancient texts, comets have been blamed for the revolt of the Shoggoths against the Elder Things, the doom of the dinosaurs, the fall of the empire of the Serpent People, the destruction of Hyperborea, the sinking of Atlantis, and even the two ages of chaos that struck early Egypt. * The most recent effect of Nemesis took place in central Siberia, June 30, 1908, when a tremendous explosion rocked the area for hundreds of miles. There was a pillar of fire and shock waves powerful enough to knock down horses 400 miles away." :sectionmap (sectionmap "The Case of Phillip Baxter" (section :name "The Case of Phillip Baxter" :scenariomap (scenariomap "Figure in the Night" (scenario :name "Figure in the Night" :summary "* An investigator wakes suddenly in the night to see the room bathed in pale green light and a strange musky smell. A vague, ghostly figure gestures toward the investigator. Suddenly, a portion of its head disappears as if bitten off. The spectre stumbles and thrashes around the room as more of the head is eaten until it is completely headless. The figure goes rigid and fades away leaving the room in darkness. * After contemplation, the figure is recognized as Professor Phillip Baxter a former teacher of the investigator. * Contacting Phillip's home gets the distraught housekeeper, Angela Vincenzo. She informs them that Phillip passed away yesterday of a sudden illness. She invites them to the funeral the next morning. * A successful Occult roll indicates that an apparition usually appears at the moment of death instead of a day later.") "Funeral of Phillip Baxter" (scenario :name "Funeral of Phillip Baxter" :summary "The services are in the rain and attended by: * Julian Baxter, the priest, in a wheelchair. * Matthew, the priest's personal attendant, who is a large, silent man. * Emmott Baxter, elder son of the deceased. * Dr. Douglas Walters, the family physician. * Silas Patterson, anthropologist and member of the Tuesday Night Academy. * Judge Braddock, executor of the estate. * Angela, the housekeeper. * Alvin Beswick, undertaker and hearse driver.") "Legacy of Phillip Baxter" (scenario :name "Legacy of Phillip Baxter" :summary "* Angela receives the property * Half of his cash goes to the Tuesday Night Academy * The remaining half goes to his three children Emmott, Colin, and Cynthia. Cynthia's portion to be donated to the Catholic Widow's Relief Fund as she requested. * At this, Emmott accuses Silas Patterson and his Tuesday Night Academy of wasting all his father's money in life and now in death. * Finally, a packet of papers is given to the investigators according to the will. This packet contains Phillip's dream journal and an short note about why he thought the investigators might be interested.") "Dream Journal of Phillip Baxter" (scenario :name "Dream Journal of Phillip Baxter" :summary "* The enclosed note describes that his dreams had become more vivid and recurring recently and that he felt that he needed to write them down and give them to someone who might find the account scientifically interesting. * He had traveled to Ultar and visited the library there. In the library, he found the book, the [Cthaat Aquadingen] which gave important insight into his current research. As Phillip left the library, he saw an evil-looking dwarf that he had seen in a carnival he passed on the way into the city. The dwarf was discretely following him. Phillip managed to shake him before he woke up. * Anyone experienced in the Dreamlands will recognize the entrance to the Dreamlands and Ultar.") "Home of Phillip Baxter" (scenario :name "Home of Phillip Baxter" :summary "* Angela Vincenzo, the former housekeeper is now the only resident in the roomy three bedroom home. * The study contains various paperwork including: ** A letter from Phillip's daughter Cynthia describing that her supposed kidnapping by natives was not as serious as he was led to believe and that she is perfectly fine. She has sent a box of coconuts as a present. ** Notes on the Tuesday Night Academy's purchase of a large telescope and their search for a 'Dark Star' called Nemesis. ** An anthropology book authored by Silas Patterson with marked section describing southeast Indian tribes displaying remnants of ritual cannibalism. Most are symbolic acts upon the death of a family member or friend, but on occasion the ritual is actually performed using a monkey or ape substitued for a human. Of particular interest is a brain eating custom where the brain is exposed and eaten directly from the skull while still warm. An elderly native said that he had seen apes killing smaller monkeys and eating their brains in similar manner. ** A diary including comments about: *** His brother Julian sudden sickness and retirement after returning from the Andaman Islands. *** Julian's subsequent suicide attempt *** Cynthia's trip to the Andaman Islands and subsequent abduction by savages. *** Her later release *** Arguments with his sons over favoritism *** His recent series of nightmares *** His therapy with Julian over his nightmares and the drug Julian prepared to help him sleep. *** The ultra-realistic new dreams after the drug put him into an especially deep sleep. *** Julian's refusal to provide more of the drug. *** Phillip's break-in of Julian's house and the successful theft of the drug. * The basement contains an unopened crate of coconuts with a small hole chewed through the side. * The attic contains a formerly extinct prehistoric spider that was in the crate of coconuts. It had bitten Phillip in his sleep and put him into a deep coma that was mistaken for death. The spider venom causes unconsciousness in 10 minutes, but the victim will revive on its own within two days."))) "Search for the Seed" (section :name "Search for the Seed" :scenariomap (scenariomap "The Garrison Observatory" (scenario :name "The Garrison Observatory" :summary "* The Tuesday Night Academy has spent a large sum of money to erect an observatory in Garrison Montana. They experiment with prisms to try to detect the dark star that their research claims has had a sweeping effect on history. * The Observatory is deep in the woods and is only accessible on horseback.") "The Defenders of the Seed" (scenario :name "The Defenders of the Seed" :summary "* The Seed - A Seed of Azathoth has been hurtling through space for centuries and has finally been drawn to Earth. As it approached, the special prisms in the telescope attracted it like sunlight off a mirror. The Seed swept across the sky and crashed in the woods. Its strange green fire trail attracted the attention of many including those at the observatory and a group of local hunters. * Sasquatch - When the hunters found and examined the asteroid, they were exposed to the horrific radiations of the Seed. Those that survived, regressed to a primitive state. They are terrified by the Seed, but are compulsively drawn to it. They have buried the Seed in an alcove of the cave in which they live. The Seed is slowly killing them, and as they die, they dissolve into a primordial soup before actually dying. * Sylvian Englund - Sylvia is a pleasant woman in her late sixties who lives off the land in the woods since the death of her husband. She has recently discovered the regressed hunters and believes that they are Sasquatch. She has been feeding them and has gained their trust. She enjoys her discovery and does not want outsiders to ruin her friendship with the sasquatch.") "The Race for the Seed" (scenario :name "The Race for the Seed" :summary "* Fungi From Yuggoth - A team of four Mi-go have observed the Seed's landing from their underground outpost on the Moon. Their goal is to retrieve the Seed to use as an magical energy source. Interesting humans captured along the way are to be de-brained and the brains carried back in cylinders for questioning later. * They each carry a machine that looks like a silver whorl. It fires a beam of deadly radiance that eats blackening holes in whatever it touches. Any damage prevented by armor is instead applied against the armor itself. The weapons have 37 charges and may not be recharged. The weapons have no range limitations and are excellent sniper weapons. * Their first target is the firetower where they slay Ranger Marshall and use the tower as a base of operations. * The next day they spray a nervous tissue solvent in the direct vicinity of the firetower to prevent intrusions. The spray forms a low fog that short circuits animal nervous systems driving them mad. A Grizzley Bear and Jules, Sylvia Englund's dog, are the first victims of the gas. Both roam the countryside acting randomly. * Later the same day, the Fungi search the observatory, leaving many tell-tale signs. * The next day, they capture Sylvia Englund near her ranch. They de-brain her and hide the body in the house. * Toward the end of the day, they move on the Seed. They make quick work of the hunters defending it. They carefully put the seed in a shielded container and fly it to the firetower. They gather their belongings, including the Seed and any captured brains, drop a bomb on the firetower to destroy any evidence, and fly back to the Moon."))) "Death in St. Augustine" (section :name "Death in St. Augustine" :scenariomap (scenariomap "Investigating Colin Baxter" (scenario :name "Investigating Colin Baxter" :summary "* Colin Baxter, Phillip's youngest child, is due a healthy piece of Phillip's estate, but he must be located first. His last known location was St. Augstine, Florida. Judge Braddock is concerned with the series of bizarre occurences and hires the investigators to track Colin down and check on his safety. * St. Augustine is a city in northeast Florida and the oldest continuously occupied European-established settlement in the continental United States. * Colin is indeed still here, but he has fallen on hard times and turned to alcohol. He can be found in a local speakeasy hidden behind a grocery store. * Harry Spitz - The grocery store/speakeasy is owned by Harry Spitz who runs the bar. He pays protection money to the police and is in no danger of police action. * Billy Wolff - Billy is a close friend of Colin's and will steadfastly defend his buddy in all circumstances, especially when drinking. * Esmerelda - Esmerelda is a Cuban born, hot-headed friend of Colin's. She is an illegal immigrant and will not reveal her last name under any circumstances to, somehow, protect her family.") "Colin's Treasure" (scenario :name "Colin's Treasure" :summary "* Colin has a history of get rich quick schemes and his current one is to find a fortune in sunken treasure. Unfortunately, his business partner ran away taking their remaining cash and Colin's girlfriend with him. Since then, Colin has been drinking his troubles away. * The inheritance money helps, but Colin is still short $2,000. He will offer the characters 50% of the profits if they chip in the money. * He believes that the wreck of the treasure galleon, La Rosaria can be found off Bimini. He claims to have an accurate map to the location. His map is hand copied from an original kept in the library of the 200 year old Spanish church. * Father Garcia - At the church they meet Father Garcia who is a friend of Esmerelda. Father Garcia is friendly but guarded. With the help of Esmerelda he admits that he fears that someone is watching him. He also admits to seeing figures moving in the dark on the church grounds, though he feels he must be imagining things. After gaining his trust, Father Garcia shares the church library. Though Colin's research is shoddy, futher research supports his findings that the map is an authentic map of the location of the La Rosaria.") "Colin's Wreck" (scenario :name "Colin's Wreck" :summary "* The Palencia - Colin invites the party aboard the old steamer he has bought and retrofitted for large scale salvage. The crew is mostly Cubans and blacks. As they depart, someone spots a reflection from the coast. Using binoculars, they see someone observing them back with binoculars before the person ducks away. * The Voyage - The map shows a location off Bimini, 300 miles south of St. Augustine. The voyage takes less than 24 hours on calm seas. * Diving - The diving pumps have enough pressure for no more than 2 divers at once. Wolff operates the pumps. Colin would prefer to dive with a partner and asks for volunteers. The divers reach the bottom in 2 minutes and tug twice on the line to indicate they are at bottom. The water is particularly clear and well illuminated by sunlight. Only 20 minutes later they spot the wreck and tug twice again. The divers return to the surface and describe that the wreck is in only 50 feet of water but is stuck on a reef hanging over a sharp drop off on one side. * Coral Outcropping - A protruding coral outcropping has pierced the hold of the hull. Anyone exploring this area will be the victim of a single sudden attack by the [Moray Eel] that makes its home here. The attack is not life threatening, but if the person bleeds the divers will have to return to the surface for fear of attracting sharks. * The Drop Off - Anyone foolish enough to explore the deck near the drop off, suddenly causes a section of the hull to break off and fall into the drop off. The falling diver can attempt to jump free, failing that he can scramble to grab the coral reef as he falls, otherwise he slowly falls 30 feet before the coral cuts his air hose and he drowns. The boat pulls him up, but it will be too late to save him unless he is extremely accomplished at holding his breath. * Captain's Cabin - Colin is most interested in the Captain's cabin where he finds a heavy lock box which needs to be winched to the surface. In it there can be found 22 forty pound silver bars worth $10000 total and a strange, large necklace. The necklace is carved with strange figures of animalistic humans celebrating a great comet with a tail that goes on forever. After a few days investigation, it is clear that the wreck does not contain the riches that Colin hoped for. Colin will be left deeply in debt. However, any characters who invested will double their investment.") "Colin's Ruins" (scenario :name "Colin's Ruins" :summary "* The Ruins - Colin desperately hopes that the treasure fell from the wreck before it landed at the bottom and begins retracing the ship's path. About a 300 yards away, he discovers what probably sank the La Rosaia: a sunken ruin whose stone ceiling lies just below the water line. No treasure is found, but Colin is desperate to find anything of value, so he moves to explore the Ruins. * Temple - The ruin is a stone temple in a bowl shaped depression with curved steps going down 20 feet before entering an archway. The temple itself is only 30 feet across and has many crabs and octopi. The walls are covered by mosaic tile that depicts people suffering during multiple terrible disasters. Above each disaster are tiles depicting an orb with a shining light nearby. * The Pit - In the center of the temple is a dark pit of indeterminate depth. Before the pit is a metal orb on a stone slab. The orb has a metal rod projecting from one side at the end of which is a shiny topaz. The rod can orbit the orb and telescope in or out, but its current position is very close to the orb. A mechanism inside the orb operates the rod and is apparently still active. The pit reaches about 100 feet before a rock cave-in blocks the way. Within the pit is a single, strange dolphin. * The Dolphin - If multiple lights are shined down the pit, a motionless dolphin can be seen. Suddenly, the normally peaceful dolphin swims up and attempts to ram people with incredible force. It will continue attacking unless the invaders leave or it is killed.") "Death of the Father" (scenario :name "Death of the Father" :summary "* Homecoming - As the Palencia arrives at port, police can be seen on the docks. When the Palencia docks, officers rush on board and arrest Colin and Wolff for the murder of Father Garcia. * Murder - Father Garcia was murdered the same day that Colin and the investigators went to the library. Witnesses say that Colin and Wolff returned drunk later that night and ransacked the library. That morning the priest was found in the church with his skull crushed. The reality is that the ghoul cult has been robbing graves for years. Father Garcia has been noticing activity in the night and has been hiding in the church at night to try to catch someone in the act. Unfortunately, he found the graverobbers and confronted them. They immediately killed him and called the Detective to cover up the murder. What the killers did not realize was that Esmerelda was coming home from the speakeasy when she heard a commotion from the church. She rushed over and observed the killers discussing what to do with the Father's body. * Detective Morris Packard - The detective is the head of the police force while the chief is on extended medical leave. He is also a member of a secret death cult that worships ghouls. His cult was graverobbing for their riturals when the Father caught them and he was dispensed with. Colin's drinking made him a convenient scapegoat, so the Detective is constructing circumstantial evidence to arrest Colin. Later he will arrange for Colin to hang himself in jail. If the investigators get too close to the cult, he will arrange an ambush to eliminate them. * Esmerelda - Esmerelda is conspicuously missing. After witnessing the murder scene, she packed her things and fled to her parents house in Clearwater. She fears for her safety and doesn't want to get involved, but when she iscovers that Colin has been frames, she writes a letter with what she saw to the investigators and Colin. * Crime Scene - Trampled in the dirt can be found a pin from the local alligator farm that was dropped in the scuffle. * St. Augustine Library - The local library carries copies of newspapers. Several stories can be found in the Jacksonville Sentinel that may be relevant. Older material is harder to discover. ** 1571 - A yellowed document in Spanish written by Father Rolando Tortulla of Toledo Spain. The document reports to the King, the state of the French heretics held prisoner in vaults below the monastery. They are wild and degenerate and are guilty of cannibalism. They will be held until they die. ** 1641 - A yellowed document in Spanish describes the construction of the Castillo de San Marcos that incorporates the catacombs of the old monastery. A violent french prisoner was transferred to a new cell. ** 1662 - A yellowed document in Spanish describes the horrid state of the French prisoner. His toes are missing and he limps around his cell scratching on the walls saying only gibberish. He will be held until he perishes. ** 1682 - A yellowed document in Spanish describes the escape of the french prisoner. Stones were removed from the wall of the cell and the prisoner fled into a tiny tunnel behind the wall. After a brief attempt to locate him, the tunnel was filled, sealing the fate of the horrible prisoner. Drawings were scratched into the ceiling showing comets and fire raining from the sky. ** 1792 - A religious paphlet describes an ancient evil unloosed by Satan. They are inhuman but walk among us like men. Many officials of the city, both past and present, belong to this secret, godless faith. ** February 1890 - A freshly buried body was stolen from a cemetary south of St. Augustine. No suspects were found. ** May 1927 - Grisly Find at Alligator Farm. Eli Simpson, an employee of the farm, saw a shoe in the large crocodile pool which turned out to also contain a severed human foot. No identification was found, and police theorize that a vagrant snuck onto the farm and fell into the pool. No charges were filed. ** October 1920 - A recently buried body of an indigent was stolen from the old St. Augustine church graveyard. No motive or suspects were found. * St. Augustine Herald - The local paper is a weekly that promotes local businesses and tourist trade. The editor/owner is Fred Boswell who bought the paper 3 years ago. Strangely, the original owners destroyed all their files before they left. * Jacksonville Sentinel - Sold next to the Herald is a real paper published in Jacksonville, a 2 hour drive up the coast.") "Korsky's Alligator Farm" (scenario :name "Korsky's Alligator Farm" :summary "* Eli Simpson - Eli found the severed foot and was subsequently fired by Maynard Korsky for alerting the police before discussing it with him first. It was not the only time he found strange meat in the pens, but it was the only thing he could clearly identify. * Maynard Korsky, Dell Korsky, and Kenny Durham run the farm. They use the gators to destroy the leftovers of the cult, but do not do any other cult business at the farm. * The Farm - If the investigators investigate the farm during the day, the Korskys and Kenny Durham are no help and the cult is alerted to their investigation. If they investigate at night, the farm is not guarded, but the gators have destroyed any evidence that might have been found.") "Castillo de San Marcos" (scenario :name "Castillo de San Marcos" :summary "* A monumental castle started in 1638 and took over a century to complete. The upper levels are open to the public, but the lower levels are considered hazardous and are sealed off with packlocked plywood doors. It is easy enough to pry the plywood loose but not without leaving evidence of tampering. The cells of the degenerate prisoners are easy to locate. The walls and ceiling are covered with scratchings of spiders and comets and skulls. In the final cell, a stone can be removed revealing a low tunnel sloping downard. Crawling on hands and knees for fifty yards reveals a hallway from the original Franciscan monastery that predated the fort. The hall leads to a small room with two chairs and black robes hanging from pegs. The room is the same as the one depicted in the films from Thornton's Camera Shop.") "Thornton Camera Store" (scenario :name "Thornton Camera Store" :summary "* The camera store has a view of the castle. William Thornton works here all day selling cameras, lens, and film. There is also a darkroom where he develops photos. * If the investigators break in they can find some smuggled Cuban ponography and three recent silent films in a locked box. * The Films - Each film is roughly the same depicting a dead body in a chair in a small stone room surrounded by hooded figures. A veiled female figure limps over and begins a ritual. The body seems to gain some semblence of life and then the figures leap upon the body and begin eating it at which point the film ends. * If confronted with the films, Thornton claims he received them by accident along with the Cuban films and that they are obviously some kind of homemade hoax.") "Thornton House" (scenario :name "Thornton House" :summary "* Mother Thornton - Mother Thornton is the matriarch of the death cult and has nearly completely transformed into a ghoul. She never goes out in public and wears a veiled hat even in private. * William will normally be at home after 5pm. During the day, the front door is not locked. If Mother Thornton hears intruders, she will stay in her room pretending to be sleeping in a chair. If she is exposed, she throws off the veil and tries to escape the house. She will leap out the second story window lope down the street scattering the citizenry. Any disturbance here will have the police arrive in five minutes where they will arrest anyone in the Thornton home for the murder of Mother Thornton. Even if she is killed the story will be that they killed a deformed and crippled old woman. * Gray Binding - Among her possessions is a book that teaches the Gray Binding spell that animates a corpse into a mindless zombie.") "St. Augustine Ambush" (scenario :name "St. Augustine Ambush" :summary "* The Note - If the investigators are discovered, Detective Packard will arrange a deadly ambush for them. He will kidnap Eli Simpson, Esmerelda, or anyone else who they think can lure the investigators. The victim leaves a note to the investigators that they have new information and to meet at the church graveyard and night. * The Churchyard - The gator farm truck is hidden to the north of the church, and the Maynards and Packard wait in ambush with pistols and blackjacks behind tombstones. At the center of the graveyard, the contact sits on a tombstone under the moonlight. Unfortunately, the victim is already dead and is merely propped up. The ambushers try to take the investigators alive, but will open fire if they have no other choice. * The Ritual - If the investigators are captured, they are taken to the ritual chamber where one of them is eaten alive while the others watch. Before the grisley feast is complete, a number of ghouls come down the tunnel and tear the cultists apart. The ghouls drag away the dead and ignore the living investigators.") "Exposing the Cult" (scenario :name "Exposing the Cult" :summary "* Exposing the Cult - Since Detective Packard is a cultist, any involvement with local police will get the investigators in trouble. If they can bring hard evidence to the Florida State Police, who will move in and clean up the mess, though they will cover up the messier parts to maintain their vital tourist trade."))) "Investigating the Andamans" (section :name "Investigating the Andamans" :scenariomap (scenariomap "Trip to the Adamans" (scenario :name "Trip to the Adamans" :summary "* The Andaman Islands are a narrow chain of islands 590 miles southeast of India. * Weather - The temperature is mild and ranges from 64F to 92F. Except for October and March, the islands are hit by daily monsoons. * Wildlife - There are no large predatory animals, just all manner of bats, rats, spiders, turtles, wild pigs, and native cats. * Population - The natives are primitive Negritoes, belived to have lived here since the Pleistocene era. Uniquely among modern man, they have no knowledge of fire building and must continually keep a fire burning. They are divided into 12 tribes with different dialects of the same language. They have a long reputation as viscious killers and cannibals. For centuries, shipwrecked sailors had been systematically slain (but not eaten). Over time, the islands have become safe to outsiders except in remote areas. * Port Blair - The British established a penal colony on the islands where convicts are forced to live and work. The colonly is a primitive jungle colony with a dock, general store, a wireless, and faily complete medical facilities. Port Blair is also the only deep water anchorage on the islands, so all ships must dock here. * Major Ashley Nichols - Major Nichols is the commissioner of the Andamans. He oversees the trade of exotic lumber, coffee, cocoa, tea, and coconuts. He also commands a small battalion of Indian solders. Nichols is happy to meet civilized westerners and will places his services and those of the British Government at their disposal. * Arrival - The Andamans are 10,000 miles from America. If the investigators use Colin's ship, the trip takes 3-4 weeks. If they book other passage, they will have to travel to Calcutta first. * Office Records - Major Nichols has nothing to hide and allows full access to the office records where a report of Cynthia Baxter's abduction can be found. In the narrative, it is found that although the abductors initially tried to take her by force, that after a short conversatiion, she agreed to go with them and was returned safely the next day. Major Nichols has only met Cynthia twice, since she rarely comes to Port Blair.") "Trek across the Adamans" (scenario :name "Trek across the Adamans" :summary "* Guides - If they request, Major Nichols will provide two Indian guides to lead them to Cynthia's clinic 45 miles away. However, he does warn that the two are criminals, working off their crimes. Worse, there are 2 escaped criminals known to be in the area. They are desperate killers and could be extremely dangerous. * Sikander - A Hindu in his mid-thirties with a wife and three children on the island. He stole a horse and has served eight years so far but is mostly trustworthy. He will, however, steal a weapon for protecting his family if he gets the chance. If successful, he will hide the weapon in the jungle for future retrieval. * Mahbub - A Moslem from Delhi who has served twenty years so far for murder. He speaks little English and is neither garrulous nor energetic. * The Jungle - The trip to Cynthia's clinic starts on timber roads, then footpaths, but before the first day is over they are struggling through thick growths and shallow swamps with no path. The trip takes three days or more, and the guides prove able servants, doing all the work of setting up camp, building a fire, and preparing meals. * The Villiage - A loud buzzing noise emanates from a clearing ahead with a tiny, abandoned villiage. The buzzing comes from a tree with a crude platform 25 feet up. Atop the platform is a rotted human form covered in a mass of undulating insects that are devouring it. Although the Andamanese normally bury their dead, if a particularly revered chief dies, he is bundled in a tree and the clan abandons their villiage for three months in reverence. If the body is disturbed, the Jarawan hunters will track the intruders and attempt to kill them for their blasphemy. * The Mission - Cynthia has a small wooden building that serves as her clinic surrounded by the huts of 20 Andamanese. Nearly a mile from the beach can be seen a 6 mile island covered with dense jungle. If local tribesman believe the island is evil, and only Cynthia has returned alive from it. The inhabitants of the island rarely leave, and when they do it is only to kidnap and kill. * Cynthia Baxter - Cynthia is a large woman, big-boned and slightly overweight. She is very near-sighted, and her voice is high pitched and squeaky. Cynthia will act hospitable to strangers, but she is highly suspiscious of those who would appear at this critical moment in her life. She lost her mother at 8 year old. She nearly died from a spider bite and 12 and began thinking of becoming a catholic nun. Instead, with the encouragement of Uncle Julian, she studied medicine in college. Julian helped her get through medical school, and she is deeply grateful to him. To impress Julian, she became a medical missionary and travelled to the Adamans in 1913. In 1918, she was kidnapped by the Tcho-Tchos from the small island across the strait. The Tcho-Tcho priest saw the mark of the spider on her, and trained her in the nature of Atlach-Nacha, their horrible spider god. Cynthia never had a strong personality and was easily brainwashed and converted to the terrible worship. The priest has convinced her that she has a special detiny (which is horribly true), and now only Julian might be able to turn her from her path. * Cynthia's Journal - In her hut is a journal that describes her facination with the teachings of the Tcho-Tcho priest and her belief that a new sun shall appear in the sky. The journal describes the arrival of Silas Patterson and his interest in the Tcho-Tcho rituals. She also writes of her mixed feeling about sending the 'present' to her father, but the priest insists that he cannot be allowed to interfere.") "Tcho Tcho Island" (scenario :name "Tcho Tcho Island" :summary "* Kidnapping - The arrival of strangers, convinces the priest that the moment has come. He sends men in the night to meet with Cynthia, and she eagarly goes with them. The local Adamanese raise an alarm and many flickering torch lights can be seen from the island. * Tcho Tcho Tribesman - The Tcho Tcho are more asian in appearance than the average Adaman. They are all violent fanatics and will hunt down and capture anyone who invades their island. There are 10 males, 6 females, and 3 children on the island. * Tcho Tcho Priest - The Tcho Tcho priest leads his tribe. He is a long time explorer in the Dreamlands and there he has the form of a twisted dwarf (reflecting his personality). In combat, the priest stands back and casts spells (Dread Curse of Azathoth and Withered Limb) while his comrades fight and die. * Fossil Quarry - An exposed rock in the jungle is covered with fossils of prehistoric arthopods including millipedes, scorpions, and spiders. This rock is the source of the spider from the Baxter home, brought to life by the Child of Atlach-Nacha spell cast by the Tcho Tcho priest. A single enormous spider six-feet across can be found here, and the priest will animate this spider if he gets the chance. Note: Any damaged fossil cannot be reanimated. * Obelisk - In a clearing near the villiage rises a black stone, twenty foot monolith. Though weathered by time, precise geometric designs are clearly visible. These designs are are disturbing to the eye and create a sense of vertigo. Out of the corner of one's eye, they seem to swirl and pulse. If one listens to the stone an almost impercetible rhythmic throbbing can be heard. Crude stones are set up around the obelisk covered in primitive drawings of spiders chasing and consuming tiny humans as shooting stars fall from the heavens. * Metamorphosis - On the night Cynthia is 'kidnapped', she goes directly to the Obelisk. There the tribesmen have gathered to begin the ceremony. Near the Obelisk are bound the 2 escaped killers that Major Nichols warned of as well as any other captured males. Cynthia stands before the altar, removes her clothes and sways to the Tcho Tcho songs. Eventually, she stops, bends over, and the skin along her back splits wide open, revealing a shiny black surface that pulses horribly. As the wrinkling empty skin of Cynthia Baxter is pushed forward, multple legs spill out from the discarded molt, waving feebly, as the huge spider-thing pushes clear. The priest dones Cynthia's discarded skin and wears it like a coat. * The Wedding Feast - Cynthia's new form is not hard enough to move freely until dawn. In the meantime, she is ceremonially wedded to the male sacrifices before she drags herself to each one and begins eating the flesh from the victims head. She finally sucks the brains out through the eyesockets. Each feast takes 20 minutes, and after each is consumed, the still animate corpses with exposed skulls are freed and shamble mindlessly off into the forest. The Onge people sense the threat of the Tcho Tcho and attack the Tcho Tcho. The Tcho Tcho defend Cynthia and the priest as they escape. The Onge will not pursue the Tcho Tcho into jungle at night. Instead the free any remaining prisoners and wait for light. The priest makes his way to the prehistoric rock and casts Child of Atlach-Nacha to animate the giant spider there. * Daughter of Atlach-Nacha - At dawn, Cynthia is fully formed and begins a 3 hour trek across the island to the Caverns of Atlach-Nacha. She is accompanied by hordes of spiders that crawl around and over her. Any who follow will constantly be treading on spiders and have spiders dropping upon them from the trees. Their bites are painful but are not dangerous. * Caverns of Atlach-Nacha - Cynthia travels to a 20 foot cave opening where her father dwells. If she is pursued, she will wait in ambush for her pursuers. If the investigators are foolish enough to continue searching, they will travel through twisting caverns deeper and deeper for over an hour before the cave opens into a vast chasm nearly filled with thick, ropy webs. Continued activity attracts [Atlach-Nacha] himself who resembles a hideous, black, hairy spider with a strange, remotely human-like face with little red, hair-rimmed eyes."))) "Ulthar and Beyond" (section :name "Ulthar and Beyond" :scenariomap (scenariomap "Exploring Ultar" (scenario :name "Exploring Ultar" :summary "* Phillip Baxter's dream journal leads the investigators to start exploring [Ulthar] in the Dreamlands. * Phillip's Dreamform - At some point someone will notice that Phillip Baxter is watching them from a distance. If anyone approaches, his head disappears in a cloud of mist and then he vanishes. * Procession of Burgomaster Kranon - Trumpets announce a parade throught the streets for Burgomaster Kranon. The Burgomaster is immediately recognizable as Matthew, Julian Baxter's ward. In the Dreamlands, his emotional and mental handicaps don't exist. If the investigators can get an audience, Krannon can be convinced to help them, both here and in the real world. * Cthaat Aquadingen - At the [Library at Ultar], the investigators can search for the [Cthaat Aquadingen]. The book is bound in soft, human skin, still pliable, and always moist from perspiration welling from its pores. Simply handling the book is creepy. Within the book can be found a quote: The stars fall, the beast bred of stone rampages, and a time of great change comes. Deep within perfumed Kled, where life turns to death, the Watcher in the Glade knows the time and place of the coming. Chinese notes are written in the margin of the page. If they are translated, they comment that the Pnankotic Manuscripts mentions the Watcher in the Glade. * Pnakotic Manuscripts - If read, the manuscripts describe that the Watcher in the Glade is the Great Old One Yibb-Tstil. Priests of Yibb-Tstil meet at the great pool in front of the ivory palace. Priests then grovel on hands and knees before Yibb-Tstil and must not look upon him. priests of * Carnival - While leaving Ultar, the dreamers chance upon a carnival tent. A barker announces that they have the only captive Colossal purple spider from the distant north. Admission is a dime or anything of value. The interior of the tent is larger than the outside would suggest, and in a barred cage at the back of the tent is a purple spider the size of a car hovering over the dessicated body of a sheep. If anyone tries to talk to the spider, it speaks in a thin, dry voice. It is, however, not helpful and eventually hisses. The barker comes running in and ushers them out. If they want to speak more, the barker says: 'It is not up to me you see'. The spider then says: 'After all, I am the master here.' If the barker is questioned about the dwarf who works here, he tells them the dwarf quit some time ago and headed to Kled.") "Journey to Kled" (scenario :name "Journey to Kled" :summary "* The perfumed Jungle of Kled can be reached by traveling North from the Enchanted Wood to Thran. At Thran a elephant caravan can be taken over land or a river boat can be taken to Hlanith where passage on a ship can be found to Kled. * Numerous ivory palaces dot the jungles. If the dreamers ask about the great pool mentioned in the Pnakotic Manuscripts, the guides recognize it as the Palace of the Sacred Fount. * Palace of the Sacred Fount - The palaces is one of the less feared locations, though it is still avoided. As with other ivory palaces in Kled, the palace is somehow physically in perfect condition though the rooms are empty and the floors are thick with dirt and leaves. The smell in the area is a unique musky odor that immediately reminds the dreamers of the smell during the dream of the death of Phillip Baxter. The front hallway is an atrium where rain water falls to collect in a rectangular pool. At the far end of the pool stands a huge jade statue of an evil-looking hyena. The statue leers with gaping jaws over the pool. The apparently bottomless pool is dark and filthly from rotting leaves, a peculiar oily film covers its surface. Despite its appearance the pool is not dangerous. * Phillip's Ghost - A distant cackling sound can be heard. Following the sound, the dreamers find a stairway going down many flights with torchlight below. At the bottom of the stairs, the dreamers find a torchlit hallway with a cell at the end. Within a cackling dwarf uses a human femur to visciously beat a glowing, partially headless, staggering figure. The dwarf is hunched and misshapen and has a terrible, inhuman face. Its lips are drawn into a snarl over three-inch fangs. Its eyes are glowing red pits. The figure is the dreamform of Phillip Baxter. If he is rescued, his headless form is mindless and helpless. The dwarf with not help under any circumstances. * Path to Yib-Tstll - Behind the Palace the jungle becomes stunted and twisted, tree trunks are bent at odd angles, and a general sense of disease pervades the growth. Futher on, alien foliage begins to appear including quivering fungi and twisting weird ferns. Further still, a great stone arch can be seen surrounded by dead trees. Through the arch can be seen another alien jungle evidently on a far-off world. The arch is clearly a permanent gate, and plants and insects can be seen crossing both ways as if the arch were simple stone. * World of Yib-Tstll - Beyond the arch, the sky is dark green and starless. Swollen insects swoop ominously from deadly-looking blooms. Flying horrors with veinous wings fly high above. Not far away, a vast, black clearing is visible. * The Clearing - The clearing is roughly a mile across. The black surface is composed of fine flakes like snow, but it is warm to the touch. If the dreamers heed the Pnakotic Manuscripts, they should crawl on hands and knees across the black clearing facing the ground to avoid actually seeing Yibb-Tstll. As the dreamers near the center, Yib-Tstll rises suddenly from the black clearing. Dreamers may attempt to avert their gaze or suffer the madness induced by his presence. * [Yibb-Tstll] - The massive being speaks telepathically with a booming alien voice. Each dreamer must make a [Spirit] test or Yibb-Tstll will ignore that person completely. If the test is completely failed, Yibb-Tstll will touch the person and impart its feared reversal. Yibb-Tstll is suprisingly helpful and will answer questions about the Cthulhu Mythos and things of cosmic import including Nemesis, but he will only give a single answer on a subject and will not clarify himself. * Reversals - Any dreamer who suffers a reversal will instantly be driven insane or his human form or dream form will be permanently killed. If an insane dreamer is brought to him, Yibb-Tstll will fully restore his sanity. If the dwarf is present, Yibb-Tstll will reverse him, and his dream form will change into the Tcho-Tcho priest while his real form will become the dwarf. If the headless form and the ghoul's page are brought before him, he touches them both and Phillip Baxter's dream fomr is restored, but back in the real world, Silas Patterson has become a mad imitation of Phillip Baxter. * Web of Eibon - Yibb-Tstll instructed Eibon in his construction of the Web of Eibon spell with which he planned to freeze time around Nemesis (and Earth) to prevent Earth's destruction. Yibb-Tstll knows his efforts will fail in the end, but it provided the instructions anyway.") "The Quest of Ghouls" (scenario :name "The Quest of Ghouls" :summary "* Ghoul Dream - After the events at St. Augustine and the Dreamlands, one night the investigators find themselves having hazy dreams of the graveyard at St. Augustine. Suddenly, the dream sharpens and 3 figures start crawling from an open grave: ghouls like the ones that may have been seen at St. Augustine. The ghouls stinking breath reeks of death and decay. The ghouls do not appear to be hostile, instead they start urging the investigators to come with them to see the wise man and there is little time left before dawn. A terrific stench issues from the open grave. Below rotten bits of wood and fabric lie on the grave floor and a narrow, twisting tunnel leads into darkness. The ghouls gibber that they must hurry and start climbing down the hole. If the dreamers don't follow the tunnel begins to slowly close. If the dreamers still do not follow, they awake normally, but the opportunity to learn more has been lost. If they do follow, the tunnel collapses behind them and they will have to follow the ghouls forward. * Grath the Leader - Young and handsome by ghoul standards, Grath leads the group and most often speaks with the dreamers. He had a riding zebra, but the group got hungry and ate most of it. * Mairpl the Big - Mairpl is much larger than the others, speaks little, and wields a club in battle. * Ug the Hungry - The worst and most degenerate of them, Ug speak no human language and spends most of his time on four legs. He avoids the humans, but can often be seen staring and drooling over them. He possess no threat, but he likes to fantasize. * The Page - At the end of the tunnel waits the Page. The Page is wrapped in a dirty brown cloak with his face hidden. His body is bent forward and staggers under the weight of an enormous tombstone chained to his back. The ghouls order the Page around and play viscious practical jokes on him. Below the hood can be found Sila Patterson's face, though it shows no recognition. Upon the tombstone is written 'Phillip A. Baxter 1865-1925.' The Page is, of course, the dream form of Silas Patterson, suffering from the guilt of the death of his friend. * The Quest - The ghoul gang seeks to rescue a female ghoul Horella who has disappeared. The ghouls are fairly melodramatic about how beautiful she is and how they must rescue her from whatever peril she is in. To find Horella, they seek the insight of the wise Man of the Mountain. This man supposedly is very wise and will answer any questions. * Social Ettiquette - After a few hours of travel, the ghouls stop for nourishment. They squat down and rummage through their stained sacks. They produce vaguely familiar cuts of raw meat with tinges of green along with sour wine. The source of the meat is all too obvious. The ghouls like their food well-aged and, out of respect, offer their guests the oldest pieces. The bags also contain the remains of Grath's zebra which the ghouls are more than happy to hand over, leaving the tastier pieces for themselves.") "Journey to the Stony Desert" (scenario :name "Journey to the Stony Desert" :summary "* The Underworld - The ghoul tunnel leads to the Underworld. Once in the Underworld, the tunnel leads upward for 3 days through the center of a huge mountain. Many ohter tunnels branch off, but the ghouls seem to know their way. Drinking water oozes down the rock wall. Bloated fungi, pale, foot-long crickets, and eyeless carnivorous rats server as food. Most of the trip is in complete darkness. Occasionally, luminescent fungi provide a tiny amount of light. The tunnels connect the Vaults of Zin where dangerous ghasts, serpent folk, or worse may be encountered. Eventually, the group exits the Underworld at the border of the [Stony Desert]. * [Stony Desert] - Grath says the journey eastward across the desert will only take a few days. They seek the sacred mountain [Mt. Hatheg-Kla] where a holy man can tell them where fair Horella can be found. * Walker of the Stony Desert - A few days journey into the desert, the dreamers see, off in the distance, a man leading a horse. They will meet in about an hour. As they draw near, it is clear that the man is enormous, towering over the horse. He is 8 feet tall, 400 lbs, and dressed all in black. His horse seems old and tired and lags behind being pulled by a rope. The horse is an elderly nag with cataract films covering both eyes. The ghouls are terrified of the man and will not approach. He does not stop walking unless he is attacked. This being is the dream-form of Eibon. the Hyperborean wizard who, like the spell he cast to capture Eibon is bound to travel back and forth across the Stony Desert. A legend says that one day he shall find a way out of the desert. On that day, the horse shall be healthy and the man shall then ride the horse. Where he goes then, he does not know for the horse shall be the master. He freely discusses his trip across the desert, Mythos knowledge, Nemesis, and his spell the Web of Eibon that Yibb-Tstl taught him. He now knows that stagnation is worse than destruction by Nemesis. If asked about Nemesis, he produces a large, shining jewel from the air and offers it to the dreamers. He says simply that all brave souls will know what to do when the time comes. Any attempt to attack Eibon results in him disappearing and reappearing far in the distance continuing his endless travels.") "The Man on the Mountain" (scenario :name "The Man on the Mountain" :summary "* [Hatheg-Kla] - A day or two after meeting the Walker, the slabs become more numerous. As they approach Mt. Hatheg-Kla, smoe of the slabs are still turned upright in the ground and bear traces of ancient carvings. Soon it becomes obvious that they are travelling in a titanic graveyard. * Climbing Hatheg-Kla - Mairpl assures them that this is the only way to see the holy man and ask where Horella is being kept. The other ghouls will wait here while Mairpl and any brave dreamers attempt the climb. The way up seems somewhat trecherous and will require a [Climb] roll to succeed. If that roll fails, a second [Climb] roll must be made to catch yourself before you fall to your doom. Unfortunately, Mairpl fails both rolls and falls far below splattering on the rocks and potentially injuring those below. After a short period of remorse, Grath and Ug gather some of the larger pieces and add them to their provision bags. * The Man on the Mountain - Near the skull tree, an old, bearded man in a yellow robe sits on a heap of corpses plundered from the cemetary below. He deftly uses a silver hatchet to cut pieces of the corpses and flings the dripping gobbets above his head as the circling Byakhees swoop down to catch them from the air. As the dreamers approach, the Byakhee scream and chatter, but the man pays them no mind. If hailed, he smiles warmly, and if asked questions he will honestly answer based on his vast knowledge of the Dreamlands and the Mythos. Knowledge comes at a price, so before he answers each question, he hurls his hatchet at the questioner which instantly slices off an appendage, starting with a hand. The Byakhee swoop down and eat the tidbit. The wound does not bleed and only hurts for a moment. The damage is permanent in the Dreamlands, but each time a dreamer returns to the Dreamlands one wound is healed. If asked, he tells that Horella is at the castle of Bombel, the giant, in the hills to the east of the [Stony Desert]. Anyone foolish enough to attach the man, is attacked by the Byakhee, rended to pieces, and eaten. * Cave of the Child God - Behind the tree, the shear face of Hatheg-Kla rises another 1000 feet before the cave entrance. A flight of steps, each one foot wide, criss-crosses back and forth up the slope. Anyone nearing the opening hears a deep sobbing and suckling sound as if from some enormous infant. The cave itself is completely black and no light will penetrate it. If anyone enters, a few seconds later, horrifying screams of agony echo from the cave accompanied by sucking, popping sounds and a soft, cooing voice. The screams continue for almost a minute before they are choked off by a gurgling, bubbling sound and a huge spray of blood that shoots from the cave. The character's dream-self is dead, and his waking self has been driven mad by the horrific dreamform of Nemesis.") "Castle of Bombel" (scenario :name "Castle of Bombel" :summary "* To the Castle - The Man on the Mountain has directed the dreamers toward a castle to the east of the [Stony Desert]. The trip takes a few days through the desert and another day throught wooded hills. * The Castle - The rude, three-story castle is in a clearing. It has a single window at the top and a door at the bottom. * Bombel - Near the castle, sitting on a boulder is a huge [Gug]. At the first sign of intruders, it rushes to the attack. * Horella - Shortly after Bombel starts fighting, a foul-looking, scaly ghoul appears in the window. This is Horella, and she immediately begins hurling vile insults and rocks at the Gug. The ghouls are cheered on by her presence, but if someone listens they realize that she is exhorting Bombel to kill the intruders. Dreamers may also notice previous bruises on Bombel's head. If Bombel falls, Horella turns her insults and rocks at her would-be rescuers. Any remaining ghouls grab a chain from their bags, say 'To the rescue', capture Horella, and drag her bumping down the stairs. The ghouls bid farewell and will offer the page as a reward for the dreamers help."))) "Nemesis: Spawn of Azathoth" (section :name "Nemesis: Spawn of Azathoth" :scenariomap (scenariomap "Trip to Darjeeling" (scenario :name "Trip to Darjeeling" :summary "* Francis Wilson - Francis is one of the Tuesday Night Academy. He was at Phillip's funeral and he has been in Russia researching the Tunguska Blast and its possible relationship to Nemesis. He has made some discoveries and sends a telegram to Judge Braddock who forwards it along. The message says to leave immediately for Darjeeling, India and to meet Colonel Hugh Huntley of the British Foreign Office. * Darjeeling - * Colonel Hugh Huntley - Francis has arranged with the British Foreign Office to allow the investigators to travel to Lhasa, Tibet to aid him in his research. Colonel Huntley provides them with papers and can help arrange transport to the British Legation in Lhasa where Francis Wilson is staying. * Road to Lhasa - The 400 mile journey to Lhasa can only be taken on foot or via horse-drawn caravan. The route is heavily trafficked by pilgrims, traders, smugglers, and spies. The journey takes weeks and is alternately terrifying, boring, facinating, cold, and misery-making. * Lhasa - Lhasa is a sprawling squat city with no building taller than 2 stories except for the Potala, the home of the Dalai Lama. The Potala is a bulky, stone structure that is imposing but unattractive. * The British Legation - The Legation is on the outskirts of Lhasa. Here Francis Wilson has residence. He seems thinner and more stressed than at the funeral. He has been researching the Tunguska Blast and mad Rasputin's apparent presence at the blast. After piecing together his research, he illegally entered the Soviet Union and stole parts of Rasputin's journal. He then fled to Tibet through Mongolia. He has been translating sections since then. He claims that Rasputin met someone called Eibon in his dreams, and that this Eibon told him of his own death. Eibon also warned him of a dark star that would fall from the sky. This Eibon gave him a stone that he used to destoy the star. He further foretells another dark star that would fall long after Rasputin's death in Tibet. Francis guesses that the location may be near an abandoned temple roughly 300 miles north of Lhasa. He has found a guide Lha-bzang who studied in the temple as a child. * Lha-bzang - Francis plans to travel there soon with a native Tibetan, Lha-bzang. Lha-bzang is a domden, a Tibetan mortician. A skilled Anthropologist may recall that Tibetan funeral rites involve the corpse being hacked to bits by the axe-wielding domden and then fed to ravens or vultures. Lha-bzang's dream form is the holy man on the mountain. Lha-bzang is going on the journey to expand his spiritual understanding. Unfortunately, he has also been paid off by a Soviet spy. If questioned about the temple, he says he was sold as a slave as a child but he fled the temple when he realized that their teachings were not Buddhist. * Ivan Dorkyev - A Soviet spy who has been tracking Francis down since Francis stole Rasputin's journal in Leningrad. He is over 6 feet tall and is dressed in the tattered robes of a yak-herder. Beneath, he carries two pistols, a knife, and a bandolier of ammo. He hides at his camp in the mountains near the ruins waiting for Lha-bzang to bring Francis. * Trip to the Ruins - Lha-bzang leads the expedition 300 miles through a tangle of steep mountain passes, brackish lakes, and arid valleys. On the way, they encounter kay-herders, small mountain monasteries, and moutain farms. About 2 weeks in to the trip, while camped, a minor earth tremor shakes everyone awake. A week laker, they arrive at the Nenmka temple, sitting on the slope of a mountain. * The Temple - The temple is now just a windswept ruin. A Mythos knowledge test reveals that the fallen columns have inscriptions used to invoke Hastur. The Soviet spy has watched the investigators approach and waits in hiding nearby. Lha-bzang finds a section of flooring with symbols on a tile. Here he will perform a ceremony to discover more about Nemesis. * The Ceremony - Lha-bzang sits and lights a clay pipe containing a tarball of hashish. He passes the pipe around and then begins a droning wail. After 30 minutes, he retrieves a knife and a freshly severed human hand from his bag. He cuts his own palm, smears blood on the hand, and binds the cut. He then passes the knife to each person to do the same. If any will not, he gestures for them to leave the prayer circle. After another 5 minutes, the hand twitches and then turns toward Lha-bzang. He asks where can they find the Seed of Nemesis. The hand then crawls to a symbols on the ground indicating 'not far' and 'north-east'. Additional questions may be asked but each question causes the questioner to receive a minor Sanity Wound. Answers are always very short, and the hand only knows local events. The Soviet spy waits nearby but has accepted Lha-bzang's demand to allow the ceremony to complete before acting. * Confrontation - Just as the ceremony is concluded, Ivan steps into the room brandishing his pistols and warning everyone to stay where they are. He is deadly serious and will gun down anyone who makes sudden movements. Ivan plans to take Francis back to the Soviet Union to stand trial for the many laws he has broken and suspiscion of being a spy. He has no knowledge of Nemesis and has nothing but contempt for the superstitious, religious ritual. If given the chance, he will tie up the investigators and then take Francis and Lha-bzang (his ally) in the morning. * The Fallen Seed - In the early morning, everything changes. Along with the bright sun, a halo forms in the sky, though this halo does not surround anything visible, yet. Dorkyev is thunder-struck; he and Francis exchange words in Russian. Ever the pragmatist, Dorkyev frees everyone and begins a descent toward the valley under the halo. Within the valley, the halo light is flat and oily, and its color melts through shades of yellow and green as though through a prism. Lha-bzang vomits and flees. Suddenly, all present feel their hair stand on end as the halo darkens and takes on a dull gun-metal hue. The slight wind disappears and everything is silent. Then, high above a sizzling sound grows in intensity. Suddenly a hideous scream is heard followed by a thunderous blast that knocks everyone off their feet. Everyone suffer partial hearing loss and if a check versus [Body] is completely failed, the loss is permanent. A blinding light rips through the sky and crashes to Earth over the valley ridge that Lha-bzang crossed. A massive explosion rocks the ground and a curtain of flame passes overhead. If not for the ridge, everyone would have been incinerated along with Lha-bzang. * Crater - Peeking over the ridge, a 20 foot crater can be seen with a sickly, green light emanating from it. Wilson frantically says that Eibon's symbol must be placed on the Seed or it will destroy the Earth. Those who have witnessed the Seed in Montana know that any who approach the Seed will die: quickly or slowly. If no one volunteers and no one has a plan, Dorkyev swears, snears of their cowardice, and takes the jewel to the crater. Alas, just as he climbs the crater and is exposed to the light, he screams and immediately melts into a puddle before everyone's horrified sight. Worse, he drops the jewel into the crater. If someone uses a mirror, they can see the jewel near the Seed which is slowly melting the rock around it with its terrible power. Wilson adamantly refuses to go (and will melt if pushed), so someone will have to sacrifice themself or watch the Seed sink into the ground and doom the world. * Eye to Azathoh - The doomed person must resist the corrupting rays, retrieve the jewel, and then touch it to the Seed. Nothing happens for a few moments, then the Seed suddenly shimmers and disappers with a sharp pop. The Seed is gone but a black, marble tunnel lies in its place. The jewel lies on the ground before the tunnel. Hyperborean symbols line the tunnel. This is Eibon's work. When the jewel crosses the threshold, it suddenly reverts to the heavy glowing stone from the Dreamlands. There is a steady breeze down the tunnel and a light can be seen ahead. After 100 meters, a room 250 meter, circular opens up. The room is the exact same shape as the jewel. The breeze has become a howling gale ending in a 5 meter gateway in the center of the other end of the room. The gateway in the center of the oval room gives the impression of an eye looking out into space. * Gateway - The gateway can be reached by a ramp that slopes upward 50 meters. Stars can clearly be seen through the opening, and it is clear that the gate leads directly into outer space. Anyone who has been exposed to the Seed radiance, has an intense desire to go through the gate and join Nemesis. Anyone approaching the gate will need ropes or climbing skill to cling to the reliefs on the floor or be sucked into oblivion. Also, the jewel gains weight as it approaches the gate, as if it is resisting, eventually becoming over 100lbs. If someone can get close or has binoculars, that person will see that the area of space beyond the portal is filled with criss-crossing black lines forming a faint web. Someone may recognize the black substance and The Black associated with Yibb-Tsll. This is Eibon's Web taught to him by Yibb-Tsll. Within the web, an observers intuitively senses that time is slowing to a crawl. Further, the web is creeping through the portal into our world. This is how mad Eibon hoped to save mankind, by freezing us forever in time, so Nemesis can never destroy us. * The End - If the jewel is brought near the gate, in addition to its increased weight, the Black lines start to reach toward the jewel. Simply hurling the jewel through the portal will gather all the webs onto the jewel which breaks the spell of Eibon. If anyone returns to the Stony Desert, they will no longer find Eibon there. The world will no longer be trapped forever in frozen time, but Nemesis will still return some day to end the world, but it will not be today.")))) :unitmap (unitmap "Julian Baxter" (unit :name "Julian Baxter" :summary "* Julian Baxter is a priest and brother of Phillip Baxter. He is confined to a wheelchair and is heavily dependent on his son Matthew. Before becoming a priest, Julian was educated as a psychotherapist. He has traveled the world on missions, but since becoming crippled he has returned to his home town. * Julian has a copy of the Book of Eibon in his library. It has a section where Eibon fortells the end of mankind with the coming of Nemesis. Eibon was obcessed with preventing man's destruction and spent the rest of his life developing a ritual call the Web of Fate that would supposedly save mankind when the time was right. Eibon claims that as Nemesis approaches, the Web of Fate will draw together seemingly unrelated events, defeat Nemesis, and create an eternal golden age for mankind. The reading clearly shows Eibon's progressive descent into madness.") "Matthew Baxter" (unit :name "Matthew Baxter" :summary "* Matthew is the adopted, grown son of Julian Baxter. He is strong, but he is also mute and aeuteistic. This combination makes him appear simple, but he is actually quite competent. He is an avid dreamer where there is no trace of his aeutism. In dreams he is a city council member in Ultar. He can be a strong ally, but he must be approached in the Dreamlands, as it is impossible to gain his friendship in the real world.") "Silas Patterson" (unit :name "Silas Patterson" :summary "* Silas is a friend of both Phillip and Julian Baxter, a past professor at Brown University, a former antrhopologist, and a member of the Tuesday Night Academy. He is quite fit considering his age. * Silas met Julian Baxter in the Congo in 1904 and became friends. In 1919, he met Cynthia Baxter, Julian's niece in the Andaman Islands. In 1920, he came to Providence where he met Phillip and joined the Tuesday Night Academy. Phillip soon after helped him get a teaching position at Brown. * Silas practices a form of cannibalism he learned in New Guinea at the instruction of a degenerate Tcho-Tcho priest. The ceremony involves eating the brains of a recently slain primate to gain extended life. This habit made him lose his job at Brown when it was discovered that he was stealing monkey corpse from the lab. He has since made an arrangement with a local undertaker with low moral character, Alvin Beswick. Silas told Beswick that he was performing brain research, but Beswick is just concerned with the money. Beswick allows him access to closed coffin corpses for a price. He was given access to Phillip's corpse and noticed the small bite marks on the scalp. While devouring the brain, Phillip suddenly lurched back to consciousness and thrased wilding before dying. Silas was terrified and is wracked with guilt over his friend's death. He is maintaining his sanity through denial, and if he is forced to confront what he has done, he will retreat inward and become catatonic and need to be institutionalized. * Silas is friendly, but he not only knows his role in Phillip's death but is reasonably sure that Cynthia was involved. He is planning to return to the Andaman Islands to investigate Cynthia's activities and also because it is getting hard to hide his youth in Providence. * In Sila's desk can be found notes for his next book, about cannibalism. The notes indicate that Silas is unbalanaced. In his files can be found the lease to a farmhouse. * Investigating the farmhouse, leads to the table where Phillip met his end. No attempt has been mde to cover up the crime."))) "Mythos Scenarios" (section :name "Mythos Scenarios" :sectionmap (sectionmap "Seeds of Azathoth" (section :name "Seeds of Azathoth" :summary "* Nemesis - Since 1984, a theory attempts to explain the mass extinctions that occur every 27 million years. The theory submits that a brown dwarf star orbits our sun at 95,000 AUs and every 27 million years it approaches close enough to rain comets throughout the solar system causing climate change, mass-extinctions, and similar catastrophes. * Seeds of Azathoth - Nemesis is, in reality, a Spawn of Azathoth that has clung to orbit around the Sun. Occasionally, pieces of Nemesis break free, falling into the solar system: the Seeds of Azathoth. Seeds that strike the Sun are destroyed, but if a seed strikes a planet, it can melt into the planet's core where it grows immensely, eventually forming a new Spawn which emerges from the broken planet like a snake from an egg. Our system's original fifth world was so parasitized. Its remnants compose the asteroid belt. * For millenia, human and other astronomers have seen in comets, 'hairy stars', approaching disaster and ill-fortune. In ancient texts, comets have been blamed for the revolt of the Shoggoths against the Elder Things, the doom of the dinosaurs, the fall of the empire of the Serpent People, the destruction of Hyperborea, the sinking of Atlantis, and even the two ages of chaos that struck early Egypt. * The most recent effect of Nemesis took place in central Siberia, June 30, 1908, when a tremendous explosion rocked the area for hundreds of miles. There was a pillar of fire and shock waves powerful enough to knock down horses 400 miles away." :sectionmap (sectionmap "The Case of Phillip Baxter" (section :name "The Case of Phillip Baxter" :scenariomap (scenariomap "Figure in the Night" (scenario :name "Figure in the Night" :summary "* An investigator wakes suddenly in the night to see the room bathed in pale green light and a strange musky smell. A vague, ghostly figure gestures toward the investigator. Suddenly, a portion of its head disappears as if bitten off. The spectre stumbles and thrashes around the room as more of the head is eaten until it is completely headless. The figure goes rigid and fades away leaving the room in darkness. * After contemplation, the figure is recognized as Professor Phillip Baxter a former teacher of the investigator. * Contacting Phillip's home gets the distraught housekeeper, Angela Vincenzo. She informs them that Phillip passed away yesterday of a sudden illness. She invites them to the funeral the next morning. * A successful Occult roll indicates that an apparition usually appears at the moment of death instead of a day later.") "Funeral of Phillip Baxter" (scenario :name "Funeral of Phillip Baxter" :summary "The services are in the rain and attended by: * Julian Baxter, the priest, in a wheelchair. * Matthew, the priest's personal attendant, who is a large, silent man. * Emmott Baxter, elder son of the deceased. * Dr. Douglas Walters, the family physician. * Silas Patterson, anthropologist and member of the Tuesday Night Academy. * Judge Braddock, executor of the estate. * Angela, the housekeeper. * Alvin Beswick, undertaker and hearse driver.") "Legacy of Phillip Baxter" (scenario :name "Legacy of Phillip Baxter" :summary "* Angela receives the property * Half of his cash goes to the Tuesday Night Academy * The remaining half goes to his three children Emmott, Colin, and Cynthia. Cynthia's portion to be donated to the Catholic Widow's Relief Fund as she requested. * At this, Emmott accuses Silas Patterson and his Tuesday Night Academy of wasting all his father's money in life and now in death. * Finally, a packet of papers is given to the investigators according to the will. This packet contains Phillip's dream journal and an short note about why he thought the investigators might be interested.") "Dream Journal of Phillip Baxter" (scenario :name "Dream Journal of Phillip Baxter" :summary "* The enclosed note describes that his dreams had become more vivid and recurring recently and that he felt that he needed to write them down and give them to someone who might find the account scientifically interesting. * He had traveled to Ultar and visited the library there. In the library, he found the book, the [Cthaat Aquadingen] which gave important insight into his current research. As Phillip left the library, he saw an evil-looking dwarf that he had seen in a carnival he passed on the way into the city. The dwarf was discretely following him. Phillip managed to shake him before he woke up. * Anyone experienced in the Dreamlands will recognize the entrance to the Dreamlands and Ultar.") "Home of Phillip Baxter" (scenario :name "Home of Phillip Baxter" :summary "* Angela Vincenzo, the former housekeeper is now the only resident in the roomy three bedroom home. * The study contains various paperwork including: ** A letter from Phillip's daughter Cynthia describing that her supposed kidnapping by natives was not as serious as he was led to believe and that she is perfectly fine. She has sent a box of coconuts as a present. ** Notes on the Tuesday Night Academy's purchase of a large telescope and their search for a 'Dark Star' called Nemesis. ** An anthropology book authored by Silas Patterson with marked section describing southeast Indian tribes displaying remnants of ritual cannibalism. Most are symbolic acts upon the death of a family member or friend, but on occasion the ritual is actually performed using a monkey or ape substitued for a human. Of particular interest is a brain eating custom where the brain is exposed and eaten directly from the skull while still warm. An elderly native said that he had seen apes killing smaller monkeys and eating their brains in similar manner. ** A diary including comments about: *** His brother Julian sudden sickness and retirement after returning from the Andaman Islands. *** Julian's subsequent suicide attempt *** Cynthia's trip to the Andaman Islands and subsequent abduction by savages. *** Her later release *** Arguments with his sons over favoritism *** His recent series of nightmares *** His therapy with Julian over his nightmares and the drug Julian prepared to help him sleep. *** The ultra-realistic new dreams after the drug put him into an especially deep sleep. *** Julian's refusal to provide more of the drug. *** Phillip's break-in of Julian's house and the successful theft of the drug. * The basement contains an unopened crate of coconuts with a small hole chewed through the side. * The attic contains a formerly extinct prehistoric spider that was in the crate of coconuts. It had bitten Phillip in his sleep and put him into a deep coma that was mistaken for death. The spider venom causes unconsciousness in 10 minutes, but the victim will revive on its own within two days."))) "Search for the Seed" (section :name "Search for the Seed" :scenariomap (scenariomap "The Garrison Observatory" (scenario :name "The Garrison Observatory" :summary "* The Tuesday Night Academy has spent a large sum of money to erect an observatory in Garrison Montana. They experiment with prisms to try to detect the dark star that their research claims has had a sweeping effect on history. * The Observatory is deep in the woods and is only accessible on horseback.") "The Defenders of the Seed" (scenario :name "The Defenders of the Seed" :summary "* The Seed - A Seed of Azathoth has been hurtling through space for centuries and has finally been drawn to Earth. As it approached, the special prisms in the telescope attracted it like sunlight off a mirror. The Seed swept across the sky and crashed in the woods. Its strange green fire trail attracted the attention of many including those at the observatory and a group of local hunters. * Sasquatch - When the hunters found and examined the asteroid, they were exposed to the horrific radiations of the Seed. Those that survived, regressed to a primitive state. They are terrified by the Seed, but are compulsively drawn to it. They have buried the Seed in an alcove of the cave in which they live. The Seed is slowly killing them, and as they die, they dissolve into a primordial soup before actually dying. * Sylvian Englund - Sylvia is a pleasant woman in her late sixties who lives off the land in the woods since the death of her husband. She has recently discovered the regressed hunters and believes that they are Sasquatch. She has been feeding them and has gained their trust. She enjoys her discovery and does not want outsiders to ruin her friendship with the sasquatch.") "The Race for the Seed" (scenario :name "The Race for the Seed" :summary "* Fungi From Yuggoth - A team of four Mi-go have observed the Seed's landing from their underground outpost on the Moon. Their goal is to retrieve the Seed to use as an magical energy source. Interesting humans captured along the way are to be de-brained and the brains carried back in cylinders for questioning later. * They each carry a machine that looks like a silver whorl. It fires a beam of deadly radiance that eats blackening holes in whatever it touches. Any damage prevented by armor is instead applied against the armor itself. The weapons have 37 charges and may not be recharged. The weapons have no range limitations and are excellent sniper weapons. * Their first target is the firetower where they slay Ranger Marshall and use the tower as a base of operations. * The next day they spray a nervous tissue solvent in the direct vicinity of the firetower to prevent intrusions. The spray forms a low fog that short circuits animal nervous systems driving them mad. A Grizzley Bear and Jules, Sylvia Englund's dog, are the first victims of the gas. Both roam the countryside acting randomly. * Later the same day, the Fungi search the observatory, leaving many tell-tale signs. * The next day, they capture Sylvia Englund near her ranch. They de-brain her and hide the body in the house. * Toward the end of the day, they move on the Seed. They make quick work of the hunters defending it. They carefully put the seed in a shielded container and fly it to the firetower. They gather their belongings, including the Seed and any captured brains, drop a bomb on the firetower to destroy any evidence, and fly back to the Moon."))) "Death in St. Augustine" (section :name "Death in St. Augustine" :scenariomap (scenariomap "Investigating Colin Baxter" (scenario :name "Investigating Colin Baxter" :summary "* Colin Baxter, Phillip's youngest child, is due a healthy piece of Phillip's estate, but he must be located first. His last known location was St. Augstine, Florida. Judge Braddock is concerned with the series of bizarre occurences and hires the investigators to track Colin down and check on his safety. * St. Augustine is a city in northeast Florida and the oldest continuously occupied European-established settlement in the continental United States. * Colin is indeed still here, but he has fallen on hard times and turned to alcohol. He can be found in a local speakeasy hidden behind a grocery store. * Harry Spitz - The grocery store/speakeasy is owned by Harry Spitz who runs the bar. He pays protection money to the police and is in no danger of police action. * Billy Wolff - Billy is a close friend of Colin's and will steadfastly defend his buddy in all circumstances, especially when drinking. * Esmerelda - Esmerelda is a Cuban born, hot-headed friend of Colin's. She is an illegal immigrant and will not reveal her last name under any circumstances to, somehow, protect her family.") "Colin's Treasure" (scenario :name "Colin's Treasure" :summary "* Colin has a history of get rich quick schemes and his current one is to find a fortune in sunken treasure. Unfortunately, his business partner ran away taking their remaining cash and Colin's girlfriend with him. Since then, Colin has been drinking his troubles away. * The inheritance money helps, but Colin is still short $2,000. He will offer the characters 50% of the profits if they chip in the money. * He believes that the wreck of the treasure galleon, La Rosaria can be found off Bimini. He claims to have an accurate map to the location. His map is hand copied from an original kept in the library of the 200 year old Spanish church. * Father Garcia - At the church they meet Father Garcia who is a friend of Esmerelda. Father Garcia is friendly but guarded. With the help of Esmerelda he admits that he fears that someone is watching him. He also admits to seeing figures moving in the dark on the church grounds, though he feels he must be imagining things. After gaining his trust, Father Garcia shares the church library. Though Colin's research is shoddy, futher research supports his findings that the map is an authentic map of the location of the La Rosaria.") "Colin's Wreck" (scenario :name "Colin's Wreck" :summary "* The Palencia - Colin invites the party aboard the old steamer he has bought and retrofitted for large scale salvage. The crew is mostly Cubans and blacks. As they depart, someone spots a reflection from the coast. Using binoculars, they see someone observing them back with binoculars before the person ducks away. * The Voyage - The map shows a location off Bimini, 300 miles south of St. Augustine. The voyage takes less than 24 hours on calm seas. * Diving - The diving pumps have enough pressure for no more than 2 divers at once. Wolff operates the pumps. Colin would prefer to dive with a partner and asks for volunteers. The divers reach the bottom in 2 minutes and tug twice on the line to indicate they are at bottom. The water is particularly clear and well illuminated by sunlight. Only 20 minutes later they spot the wreck and tug twice again. The divers return to the surface and describe that the wreck is in only 50 feet of water but is stuck on a reef hanging over a sharp drop off on one side. * Coral Outcropping - A protruding coral outcropping has pierced the hold of the hull. Anyone exploring this area will be the victim of a single sudden attack by the [Moray Eel] that makes its home here. The attack is not life threatening, but if the person bleeds the divers will have to return to the surface for fear of attracting sharks. * The Drop Off - Anyone foolish enough to explore the deck near the drop off, suddenly causes a section of the hull to break off and fall into the drop off. The falling diver can attempt to jump free, failing that he can scramble to grab the coral reef as he falls, otherwise he slowly falls 30 feet before the coral cuts his air hose and he drowns. The boat pulls him up, but it will be too late to save him unless he is extremely accomplished at holding his breath. * Captain's Cabin - Colin is most interested in the Captain's cabin where he finds a heavy lock box which needs to be winched to the surface. In it there can be found 22 forty pound silver bars worth $10000 total and a strange, large necklace. The necklace is carved with strange figures of animalistic humans celebrating a great comet with a tail that goes on forever. After a few days investigation, it is clear that the wreck does not contain the riches that Colin hoped for. Colin will be left deeply in debt. However, any characters who invested will double their investment.") "Colin's Ruins" (scenario :name "Colin's Ruins" :summary "* The Ruins - Colin desperately hopes that the treasure fell from the wreck before it landed at the bottom and begins retracing the ship's path. About a 300 yards away, he discovers what probably sank the La Rosaia: a sunken ruin whose stone ceiling lies just below the water line. No treasure is found, but Colin is desperate to find anything of value, so he moves to explore the Ruins. * Temple - The ruin is a stone temple in a bowl shaped depression with curved steps going down 20 feet before entering an archway. The temple itself is only 30 feet across and has many crabs and octopi. The walls are covered by mosaic tile that depicts people suffering during multiple terrible disasters. Above each disaster are tiles depicting an orb with a shining light nearby. * The Pit - In the center of the temple is a dark pit of indeterminate depth. Before the pit is a metal orb on a stone slab. The orb has a metal rod projecting from one side at the end of which is a shiny topaz. The rod can orbit the orb and telescope in or out, but its current position is very close to the orb. A mechanism inside the orb operates the rod and is apparently still active. The pit reaches about 100 feet before a rock cave-in blocks the way. Within the pit is a single, strange dolphin. * The Dolphin - If multiple lights are shined down the pit, a motionless dolphin can be seen. Suddenly, the normally peaceful dolphin swims up and attempts to ram people with incredible force. It will continue attacking unless the invaders leave or it is killed.") "Death of the Father" (scenario :name "Death of the Father" :summary "* Homecoming - As the Palencia arrives at port, police can be seen on the docks. When the Palencia docks, officers rush on board and arrest Colin and Wolff for the murder of Father Garcia. * Murder - Father Garcia was murdered the same day that Colin and the investigators went to the library. Witnesses say that Colin and Wolff returned drunk later that night and ransacked the library. That morning the priest was found in the church with his skull crushed. The reality is that the ghoul cult has been robbing graves for years. Father Garcia has been noticing activity in the night and has been hiding in the church at night to try to catch someone in the act. Unfortunately, he found the graverobbers and confronted them. They immediately killed him and called the Detective to cover up the murder. What the killers did not realize was that Esmerelda was coming home from the speakeasy when she heard a commotion from the church. She rushed over and observed the killers discussing what to do with the Father's body. * Detective Morris Packard - The detective is the head of the police force while the chief is on extended medical leave. He is also a member of a secret death cult that worships ghouls. His cult was graverobbing for their riturals when the Father caught them and he was dispensed with. Colin's drinking made him a convenient scapegoat, so the Detective is constructing circumstantial evidence to arrest Colin. Later he will arrange for Colin to hang himself in jail. If the investigators get too close to the cult, he will arrange an ambush to eliminate them. * Esmerelda - Esmerelda is conspicuously missing. After witnessing the murder scene, she packed her things and fled to her parents house in Clearwater. She fears for her safety and doesn't want to get involved, but when she iscovers that Colin has been frames, she writes a letter with what she saw to the investigators and Colin. * Crime Scene - Trampled in the dirt can be found a pin from the local alligator farm that was dropped in the scuffle. * St. Augustine Library - The local library carries copies of newspapers. Several stories can be found in the Jacksonville Sentinel that may be relevant. Older material is harder to discover. ** 1571 - A yellowed document in Spanish written by Father Rolando Tortulla of Toledo Spain. The document reports to the King, the state of the French heretics held prisoner in vaults below the monastery. They are wild and degenerate and are guilty of cannibalism. They will be held until they die. ** 1641 - A yellowed document in Spanish describes the construction of the Castillo de San Marcos that incorporates the catacombs of the old monastery. A violent french prisoner was transferred to a new cell. ** 1662 - A yellowed document in Spanish describes the horrid state of the French prisoner. His toes are missing and he limps around his cell scratching on the walls saying only gibberish. He will be held until he perishes. ** 1682 - A yellowed document in Spanish describes the escape of the french prisoner. Stones were removed from the wall of the cell and the prisoner fled into a tiny tunnel behind the wall. After a brief attempt to locate him, the tunnel was filled, sealing the fate of the horrible prisoner. Drawings were scratched into the ceiling showing comets and fire raining from the sky. ** 1792 - A religious paphlet describes an ancient evil unloosed by Satan. They are inhuman but walk among us like men. Many officials of the city, both past and present, belong to this secret, godless faith. ** February 1890 - A freshly buried body was stolen from a cemetary south of St. Augustine. No suspects were found. ** May 1927 - Grisly Find at Alligator Farm. Eli Simpson, an employee of the farm, saw a shoe in the large crocodile pool which turned out to also contain a severed human foot. No identification was found, and police theorize that a vagrant snuck onto the farm and fell into the pool. No charges were filed. ** October 1920 - A recently buried body of an indigent was stolen from the old St. Augustine church graveyard. No motive or suspects were found. * St. Augustine Herald - The local paper is a weekly that promotes local businesses and tourist trade. The editor/owner is Fred Boswell who bought the paper 3 years ago. Strangely, the original owners destroyed all their files before they left. * Jacksonville Sentinel - Sold next to the Herald is a real paper published in Jacksonville, a 2 hour drive up the coast.") "Korsky's Alligator Farm" (scenario :name "Korsky's Alligator Farm" :summary "* Eli Simpson - Eli found the severed foot and was subsequently fired by Maynard Korsky for alerting the police before discussing it with him first. It was not the only time he found strange meat in the pens, but it was the only thing he could clearly identify. * Maynard Korsky, Dell Korsky, and Kenny Durham run the farm. They use the gators to destroy the leftovers of the cult, but do not do any other cult business at the farm. * The Farm - If the investigators investigate the farm during the day, the Korskys and Kenny Durham are no help and the cult is alerted to their investigation. If they investigate at night, the farm is not guarded, but the gators have destroyed any evidence that might have been found.") "Castillo de San Marcos" (scenario :name "Castillo de San Marcos" :summary "* A monumental castle started in 1638 and took over a century to complete. The upper levels are open to the public, but the lower levels are considered hazardous and are sealed off with packlocked plywood doors. It is easy enough to pry the plywood loose but not without leaving evidence of tampering. The cells of the degenerate prisoners are easy to locate. The walls and ceiling are covered with scratchings of spiders and comets and skulls. In the final cell, a stone can be removed revealing a low tunnel sloping downard. Crawling on hands and knees for fifty yards reveals a hallway from the original Franciscan monastery that predated the fort. The hall leads to a small room with two chairs and black robes hanging from pegs. The room is the same as the one depicted in the films from Thornton's Camera Shop.") "Thornton Camera Store" (scenario :name "Thornton Camera Store" :summary "* The camera store has a view of the castle. William Thornton works here all day selling cameras, lens, and film. There is also a darkroom where he develops photos. * If the investigators break in they can find some smuggled Cuban ponography and three recent silent films in a locked box. * The Films - Each film is roughly the same depicting a dead body in a chair in a small stone room surrounded by hooded figures. A veiled female figure limps over and begins a ritual. The body seems to gain some semblence of life and then the figures leap upon the body and begin eating it at which point the film ends. * If confronted with the films, Thornton claims he received them by accident along with the Cuban films and that they are obviously some kind of homemade hoax.") "Thornton House" (scenario :name "Thornton House" :summary "* Mother Thornton - Mother Thornton is the matriarch of the death cult and has nearly completely transformed into a ghoul. She never goes out in public and wears a veiled hat even in private. * William will normally be at home after 5pm. During the day, the front door is not locked. If Mother Thornton hears intruders, she will stay in her room pretending to be sleeping in a chair. If she is exposed, she throws off the veil and tries to escape the house. She will leap out the second story window lope down the street scattering the citizenry. Any disturbance here will have the police arrive in five minutes where they will arrest anyone in the Thornton home for the murder of Mother Thornton. Even if she is killed the story will be that they killed a deformed and crippled old woman. * Gray Binding - Among her possessions is a book that teaches the Gray Binding spell that animates a corpse into a mindless zombie.") "St. Augustine Ambush" (scenario :name "St. Augustine Ambush" :summary "* The Note - If the investigators are discovered, Detective Packard will arrange a deadly ambush for them. He will kidnap Eli Simpson, Esmerelda, or anyone else who they think can lure the investigators. The victim leaves a note to the investigators that they have new information and to meet at the church graveyard and night. * The Churchyard - The gator farm truck is hidden to the north of the church, and the Maynards and Packard wait in ambush with pistols and blackjacks behind tombstones. At the center of the graveyard, the contact sits on a tombstone under the moonlight. Unfortunately, the victim is already dead and is merely propped up. The ambushers try to take the investigators alive, but will open fire if they have no other choice. * The Ritual - If the investigators are captured, they are taken to the ritual chamber where one of them is eaten alive while the others watch. Before the grisley feast is complete, a number of ghouls come down the tunnel and tear the cultists apart. The ghouls drag away the dead and ignore the living investigators.") "Exposing the Cult" (scenario :name "Exposing the Cult" :summary "* Exposing the Cult - Since Detective Packard is a cultist, any involvement with local police will get the investigators in trouble. If they can bring hard evidence to the Florida State Police, who will move in and clean up the mess, though they will cover up the messier parts to maintain their vital tourist trade."))) "Investigating the Andamans" (section :name "Investigating the Andamans" :scenariomap (scenariomap "Trip to the Adamans" (scenario :name "Trip to the Adamans" :summary "* The Andaman Islands are a narrow chain of islands 590 miles southeast of India. * Weather - The temperature is mild and ranges from 64F to 92F. Except for October and March, the islands are hit by daily monsoons. * Wildlife - There are no large predatory animals, just all manner of bats, rats, spiders, turtles, wild pigs, and native cats. * Population - The natives are primitive Negritoes, belived to have lived here since the Pleistocene era. Uniquely among modern man, they have no knowledge of fire building and must continually keep a fire burning. They are divided into 12 tribes with different dialects of the same language. They have a long reputation as viscious killers and cannibals. For centuries, shipwrecked sailors had been systematically slain (but not eaten). Over time, the islands have become safe to outsiders except in remote areas. * Port Blair - The British established a penal colony on the islands where convicts are forced to live and work. The colonly is a primitive jungle colony with a dock, general store, a wireless, and faily complete medical facilities. Port Blair is also the only deep water anchorage on the islands, so all ships must dock here. * Major Ashley Nichols - Major Nichols is the commissioner of the Andamans. He oversees the trade of exotic lumber, coffee, cocoa, tea, and coconuts. He also commands a small battalion of Indian solders. Nichols is happy to meet civilized westerners and will places his services and those of the British Government at their disposal. * Arrival - The Andamans are 10,000 miles from America. If the investigators use Colin's ship, the trip takes 3-4 weeks. If they book other passage, they will have to travel to Calcutta first. * Office Records - Major Nichols has nothing to hide and allows full access to the office records where a report of Cynthia Baxter's abduction can be found. In the narrative, it is found that although the abductors initially tried to take her by force, that after a short conversatiion, she agreed to go with them and was returned safely the next day. Major Nichols has only met Cynthia twice, since she rarely comes to Port Blair.") "Trek across the Adamans" (scenario :name "Trek across the Adamans" :summary "* Guides - If they request, Major Nichols will provide two Indian guides to lead them to Cynthia's clinic 45 miles away. However, he does warn that the two are criminals, working off their crimes. Worse, there are 2 escaped criminals known to be in the area. They are desperate killers and could be extremely dangerous. * Sikander - A Hindu in his mid-thirties with a wife and three children on the island. He stole a horse and has served eight years so far but is mostly trustworthy. He will, however, steal a weapon for protecting his family if he gets the chance. If successful, he will hide the weapon in the jungle for future retrieval. * Mahbub - A Moslem from Delhi who has served twenty years so far for murder. He speaks little English and is neither garrulous nor energetic. * The Jungle - The trip to Cynthia's clinic starts on timber roads, then footpaths, but before the first day is over they are struggling through thick growths and shallow swamps with no path. The trip takes three days or more, and the guides prove able servants, doing all the work of setting up camp, building a fire, and preparing meals. * The Villiage - A loud buzzing noise emanates from a clearing ahead with a tiny, abandoned villiage. The buzzing comes from a tree with a crude platform 25 feet up. Atop the platform is a rotted human form covered in a mass of undulating insects that are devouring it. Although the Andamanese normally bury their dead, if a particularly revered chief dies, he is bundled in a tree and the clan abandons their villiage for three months in reverence. If the body is disturbed, the Jarawan hunters will track the intruders and attempt to kill them for their blasphemy. * The Mission - Cynthia has a small wooden building that serves as her clinic surrounded by the huts of 20 Andamanese. Nearly a mile from the beach can be seen a 6 mile island covered with dense jungle. If local tribesman believe the island is evil, and only Cynthia has returned alive from it. The inhabitants of the island rarely leave, and when they do it is only to kidnap and kill. * Cynthia Baxter - Cynthia is a large woman, big-boned and slightly overweight. She is very near-sighted, and her voice is high pitched and squeaky. Cynthia will act hospitable to strangers, but she is highly suspiscious of those who would appear at this critical moment in her life. She lost her mother at 8 year old. She nearly died from a spider bite and 12 and began thinking of becoming a catholic nun. Instead, with the encouragement of Uncle Julian, she studied medicine in college. Julian helped her get through medical school, and she is deeply grateful to him. To impress Julian, she became a medical missionary and travelled to the Adamans in 1913. In 1918, she was kidnapped by the Tcho-Tchos from the small island across the strait. The Tcho-Tcho priest saw the mark of the spider on her, and trained her in the nature of Atlach-Nacha, their horrible spider god. Cynthia never had a strong personality and was easily brainwashed and converted to the terrible worship. The priest has convinced her that she has a special detiny (which is horribly true), and now only Julian might be able to turn her from her path. * Cynthia's Journal - In her hut is a journal that describes her facination with the teachings of the Tcho-Tcho priest and her belief that a new sun shall appear in the sky. The journal describes the arrival of Silas Patterson and his interest in the Tcho-Tcho rituals. She also writes of her mixed feeling about sending the 'present' to her father, but the priest insists that he cannot be allowed to interfere.") "Tcho Tcho Island" (scenario :name "Tcho Tcho Island" :summary "* Kidnapping - The arrival of strangers, convinces the priest that the moment has come. He sends men in the night to meet with Cynthia, and she eagarly goes with them. The local Adamanese raise an alarm and many flickering torch lights can be seen from the island. * Tcho Tcho Tribesman - The Tcho Tcho are more asian in appearance than the average Adaman. They are all violent fanatics and will hunt down and capture anyone who invades their island. There are 10 males, 6 females, and 3 children on the island. * Tcho Tcho Priest - The Tcho Tcho priest leads his tribe. He is a long time explorer in the Dreamlands and there he has the form of a twisted dwarf (reflecting his personality). In combat, the priest stands back and casts spells (Dread Curse of Azathoth and Withered Limb) while his comrades fight and die. * Fossil Quarry - An exposed rock in the jungle is covered with fossils of prehistoric arthopods including millipedes, scorpions, and spiders. This rock is the source of the spider from the Baxter home, brought to life by the Child of Atlach-Nacha spell cast by the Tcho Tcho priest. A single enormous spider six-feet across can be found here, and the priest will animate this spider if he gets the chance. Note: Any damaged fossil cannot be reanimated. * Obelisk - In a clearing near the villiage rises a black stone, twenty foot monolith. Though weathered by time, precise geometric designs are clearly visible. These designs are are disturbing to the eye and create a sense of vertigo. Out of the corner of one's eye, they seem to swirl and pulse. If one listens to the stone an almost impercetible rhythmic throbbing can be heard. Crude stones are set up around the obelisk covered in primitive drawings of spiders chasing and consuming tiny humans as shooting stars fall from the heavens. * Metamorphosis - On the night Cynthia is 'kidnapped', she goes directly to the Obelisk. There the tribesmen have gathered to begin the ceremony. Near the Obelisk are bound the 2 escaped killers that Major Nichols warned of as well as any other captured males. Cynthia stands before the altar, removes her clothes and sways to the Tcho Tcho songs. Eventually, she stops, bends over, and the skin along her back splits wide open, revealing a shiny black surface that pulses horribly. As the wrinkling empty skin of Cynthia Baxter is pushed forward, multple legs spill out from the discarded molt, waving feebly, as the huge spider-thing pushes clear. The priest dones Cynthia's discarded skin and wears it like a coat. * The Wedding Feast - Cynthia's new form is not hard enough to move freely until dawn. In the meantime, she is ceremonially wedded to the male sacrifices before she drags herself to each one and begins eating the flesh from the victims head. She finally sucks the brains out through the eyesockets. Each feast takes 20 minutes, and after each is consumed, the still animate corpses with exposed skulls are freed and shamble mindlessly off into the forest. The Onge people sense the threat of the Tcho Tcho and attack the Tcho Tcho. The Tcho Tcho defend Cynthia and the priest as they escape. The Onge will not pursue the Tcho Tcho into jungle at night. Instead the free any remaining prisoners and wait for light. The priest makes his way to the prehistoric rock and casts Child of Atlach-Nacha to animate the giant spider there. * Daughter of Atlach-Nacha - At dawn, Cynthia is fully formed and begins a 3 hour trek across the island to the Caverns of Atlach-Nacha. She is accompanied by hordes of spiders that crawl around and over her. Any who follow will constantly be treading on spiders and have spiders dropping upon them from the trees. Their bites are painful but are not dangerous. * Caverns of Atlach-Nacha - Cynthia travels to a 20 foot cave opening where her father dwells. If she is pursued, she will wait in ambush for her pursuers. If the investigators are foolish enough to continue searching, they will travel through twisting caverns deeper and deeper for over an hour before the cave opens into a vast chasm nearly filled with thick, ropy webs. Continued activity attracts [Atlach-Nacha] himself who resembles a hideous, black, hairy spider with a strange, remotely human-like face with little red, hair-rimmed eyes."))) "Ulthar and Beyond" (section :name "Ulthar and Beyond" :scenariomap (scenariomap "Exploring Ultar" (scenario :name "Exploring Ultar" :summary "* Phillip Baxter's dream journal leads the investigators to start exploring [Ulthar] in the Dreamlands. * Phillip's Dreamform - At some point someone will notice that Phillip Baxter is watching them from a distance. If anyone approaches, his head disappears in a cloud of mist and then he vanishes. * Procession of Burgomaster Kranon - Trumpets announce a parade throught the streets for Burgomaster Kranon. The Burgomaster is immediately recognizable as Matthew, Julian Baxter's ward. In the Dreamlands, his emotional and mental handicaps don't exist. If the investigators can get an audience, Krannon can be convinced to help them, both here and in the real world. * Cthaat Aquadingen - At the [Library at Ultar], the investigators can search for the [Cthaat Aquadingen]. The book is bound in soft, human skin, still pliable, and always moist from perspiration welling from its pores. Simply handling the book is creepy. Within the book can be found a quote: The stars fall, the beast bred of stone rampages, and a time of great change comes. Deep within perfumed Kled, where life turns to death, the Watcher in the Glade knows the time and place of the coming. Chinese notes are written in the margin of the page. If they are translated, they comment that the Pnankotic Manuscripts mentions the Watcher in the Glade. * Pnakotic Manuscripts - If read, the manuscripts describe that the Watcher in the Glade is the Great Old One Yibb-Tstil. Priests of Yibb-Tstil meet at the great pool in front of the ivory palace. Priests then grovel on hands and knees before Yibb-Tstil and must not look upon him. priests of * Carnival - While leaving Ultar, the dreamers chance upon a carnival tent. A barker announces that they have the only captive Colossal purple spider from the distant north. Admission is a dime or anything of value. The interior of the tent is larger than the outside would suggest, and in a barred cage at the back of the tent is a purple spider the size of a car hovering over the dessicated body of a sheep. If anyone tries to talk to the spider, it speaks in a thin, dry voice. It is, however, not helpful and eventually hisses. The barker comes running in and ushers them out. If they want to speak more, the barker says: 'It is not up to me you see'. The spider then says: 'After all, I am the master here.' If the barker is questioned about the dwarf who works here, he tells them the dwarf quit some time ago and headed to Kled.") "Journey to Kled" (scenario :name "Journey to Kled" :summary "* The perfumed Jungle of Kled can be reached by traveling North from the Enchanted Wood to Thran. At Thran a elephant caravan can be taken over land or a river boat can be taken to Hlanith where passage on a ship can be found to Kled. * Numerous ivory palaces dot the jungles. If the dreamers ask about the great pool mentioned in the Pnakotic Manuscripts, the guides recognize it as the Palace of the Sacred Fount. * Palace of the Sacred Fount - The palaces is one of the less feared locations, though it is still avoided. As with other ivory palaces in Kled, the palace is somehow physically in perfect condition though the rooms are empty and the floors are thick with dirt and leaves. The smell in the area is a unique musky odor that immediately reminds the dreamers of the smell during the dream of the death of Phillip Baxter. The front hallway is an atrium where rain water falls to collect in a rectangular pool. At the far end of the pool stands a huge jade statue of an evil-looking hyena. The statue leers with gaping jaws over the pool. The apparently bottomless pool is dark and filthly from rotting leaves, a peculiar oily film covers its surface. Despite its appearance the pool is not dangerous. * Phillip's Ghost - A distant cackling sound can be heard. Following the sound, the dreamers find a stairway going down many flights with torchlight below. At the bottom of the stairs, the dreamers find a torchlit hallway with a cell at the end. Within a cackling dwarf uses a human femur to visciously beat a glowing, partially headless, staggering figure. The dwarf is hunched and misshapen and has a terrible, inhuman face. Its lips are drawn into a snarl over three-inch fangs. Its eyes are glowing red pits. The figure is the dreamform of Phillip Baxter. If he is rescued, his headless form is mindless and helpless. The dwarf with not help under any circumstances. * Path to Yib-Tstll - Behind the Palace the jungle becomes stunted and twisted, tree trunks are bent at odd angles, and a general sense of disease pervades the growth. Futher on, alien foliage begins to appear including quivering fungi and twisting weird ferns. Further still, a great stone arch can be seen surrounded by dead trees. Through the arch can be seen another alien jungle evidently on a far-off world. The arch is clearly a permanent gate, and plants and insects can be seen crossing both ways as if the arch were simple stone. * World of Yib-Tstll - Beyond the arch, the sky is dark green and starless. Swollen insects swoop ominously from deadly-looking blooms. Flying horrors with veinous wings fly high above. Not far away, a vast, black clearing is visible. * The Clearing - The clearing is roughly a mile across. The black surface is composed of fine flakes like snow, but it is warm to the touch. If the dreamers heed the Pnakotic Manuscripts, they should crawl on hands and knees across the black clearing facing the ground to avoid actually seeing Yibb-Tstll. As the dreamers near the center, Yib-Tstll rises suddenly from the black clearing. Dreamers may attempt to avert their gaze or suffer the madness induced by his presence. * [Yibb-Tstll] - The massive being speaks telepathically with a booming alien voice. Each dreamer must make a [Spirit] test or Yibb-Tstll will ignore that person completely. If the test is completely failed, Yibb-Tstll will touch the person and impart its feared reversal. Yibb-Tstll is suprisingly helpful and will answer questions about the Cthulhu Mythos and things of cosmic import including Nemesis, but he will only give a single answer on a subject and will not clarify himself. * Reversals - Any dreamer who suffers a reversal will instantly be driven insane or his human form or dream form will be permanently killed. If an insane dreamer is brought to him, Yibb-Tstll will fully restore his sanity. If the dwarf is present, Yibb-Tstll will reverse him, and his dream form will change into the Tcho-Tcho priest while his real form will become the dwarf. If the headless form and the ghoul's page are brought before him, he touches them both and Phillip Baxter's dream fomr is restored, but back in the real world, Silas Patterson has become a mad imitation of Phillip Baxter. * Web of Eibon - Yibb-Tstll instructed Eibon in his construction of the Web of Eibon spell with which he planned to freeze time around Nemesis (and Earth) to prevent Earth's destruction. Yibb-Tstll knows his efforts will fail in the end, but it provided the instructions anyway.") "The Quest of Ghouls" (scenario :name "The Quest of Ghouls" :summary "* Ghoul Dream - After the events at St. Augustine and the Dreamlands, one night the investigators find themselves having hazy dreams of the graveyard at St. Augustine. Suddenly, the dream sharpens and 3 figures start crawling from an open grave: ghouls like the ones that may have been seen at St. Augustine. The ghouls stinking breath reeks of death and decay. The ghouls do not appear to be hostile, instead they start urging the investigators to come with them to see the wise man and there is little time left before dawn. A terrific stench issues from the open grave. Below rotten bits of wood and fabric lie on the grave floor and a narrow, twisting tunnel leads into darkness. The ghouls gibber that they must hurry and start climbing down the hole. If the dreamers don't follow the tunnel begins to slowly close. If the dreamers still do not follow, they awake normally, but the opportunity to learn more has been lost. If they do follow, the tunnel collapses behind them and they will have to follow the ghouls forward. * Grath the Leader - Young and handsome by ghoul standards, Grath leads the group and most often speaks with the dreamers. He had a riding zebra, but the group got hungry and ate most of it. * Mairpl the Big - Mairpl is much larger than the others, speaks little, and wields a club in battle. * Ug the Hungry - The worst and most degenerate of them, Ug speak no human language and spends most of his time on four legs. He avoids the humans, but can often be seen staring and drooling over them. He possess no threat, but he likes to fantasize. * The Page - At the end of the tunnel waits the Page. The Page is wrapped in a dirty brown cloak with his face hidden. His body is bent forward and staggers under the weight of an enormous tombstone chained to his back. The ghouls order the Page around and play viscious practical jokes on him. Below the hood can be found Sila Patterson's face, though it shows no recognition. Upon the tombstone is written 'Phillip A. Baxter 1865-1925.' The Page is, of course, the dream form of Silas Patterson, suffering from the guilt of the death of his friend. * The Quest - The ghoul gang seeks to rescue a female ghoul Horella who has disappeared. The ghouls are fairly melodramatic about how beautiful she is and how they must rescue her from whatever peril she is in. To find Horella, they seek the insight of the wise Man of the Mountain. This man supposedly is very wise and will answer any questions. * Social Ettiquette - After a few hours of travel, the ghouls stop for nourishment. They squat down and rummage through their stained sacks. They produce vaguely familiar cuts of raw meat with tinges of green along with sour wine. The source of the meat is all too obvious. The ghouls like their food well-aged and, out of respect, offer their guests the oldest pieces. The bags also contain the remains of Grath's zebra which the ghouls are more than happy to hand over, leaving the tastier pieces for themselves.") "Journey to the Stony Desert" (scenario :name "Journey to the Stony Desert" :summary "* The Underworld - The ghoul tunnel leads to the Underworld. Once in the Underworld, the tunnel leads upward for 3 days through the center of a huge mountain. Many ohter tunnels branch off, but the ghouls seem to know their way. Drinking water oozes down the rock wall. Bloated fungi, pale, foot-long crickets, and eyeless carnivorous rats server as food. Most of the trip is in complete darkness. Occasionally, luminescent fungi provide a tiny amount of light. The tunnels connect the Vaults of Zin where dangerous ghasts, serpent folk, or worse may be encountered. Eventually, the group exits the Underworld at the border of the [Stony Desert]. * [Stony Desert] - Grath says the journey eastward across the desert will only take a few days. They seek the sacred mountain [Mt. Hatheg-Kla] where a holy man can tell them where fair Horella can be found. * Walker of the Stony Desert - A few days journey into the desert, the dreamers see, off in the distance, a man leading a horse. They will meet in about an hour. As they draw near, it is clear that the man is enormous, towering over the horse. He is 8 feet tall, 400 lbs, and dressed all in black. His horse seems old and tired and lags behind being pulled by a rope. The horse is an elderly nag with cataract films covering both eyes. The ghouls are terrified of the man and will not approach. He does not stop walking unless he is attacked. This being is the dream-form of Eibon. the Hyperborean wizard who, like the spell he cast to capture Eibon is bound to travel back and forth across the Stony Desert. A legend says that one day he shall find a way out of the desert. On that day, the horse shall be healthy and the man shall then ride the horse. Where he goes then, he does not know for the horse shall be the master. He freely discusses his trip across the desert, Mythos knowledge, Nemesis, and his spell the Web of Eibon that Yibb-Tstl taught him. He now knows that stagnation is worse than destruction by Nemesis. If asked about Nemesis, he produces a large, shining jewel from the air and offers it to the dreamers. He says simply that all brave souls will know what to do when the time comes. Any attempt to attack Eibon results in him disappearing and reappearing far in the distance continuing his endless travels.") "The Man on the Mountain" (scenario :name "The Man on the Mountain" :summary "* [Hatheg-Kla] - A day or two after meeting the Walker, the slabs become more numerous. As they approach Mt. Hatheg-Kla, smoe of the slabs are still turned upright in the ground and bear traces of ancient carvings. Soon it becomes obvious that they are travelling in a titanic graveyard. * Climbing Hatheg-Kla - Mairpl assures them that this is the only way to see the holy man and ask where Horella is being kept. The other ghouls will wait here while Mairpl and any brave dreamers attempt the climb. The way up seems somewhat trecherous and will require a [Climb] roll to succeed. If that roll fails, a second [Climb] roll must be made to catch yourself before you fall to your doom. Unfortunately, Mairpl fails both rolls and falls far below splattering on the rocks and potentially injuring those below. After a short period of remorse, Grath and Ug gather some of the larger pieces and add them to their provision bags. * The Man on the Mountain - Near the skull tree, an old, bearded man in a yellow robe sits on a heap of corpses plundered from the cemetary below. He deftly uses a silver hatchet to cut pieces of the corpses and flings the dripping gobbets above his head as the circling Byakhees swoop down to catch them from the air. As the dreamers approach, the Byakhee scream and chatter, but the man pays them no mind. If hailed, he smiles warmly, and if asked questions he will honestly answer based on his vast knowledge of the Dreamlands and the Mythos. Knowledge comes at a price, so before he answers each question, he hurls his hatchet at the questioner which instantly slices off an appendage, starting with a hand. The Byakhee swoop down and eat the tidbit. The wound does not bleed and only hurts for a moment. The damage is permanent in the Dreamlands, but each time a dreamer returns to the Dreamlands one wound is healed. If asked, he tells that Horella is at the castle of Bombel, the giant, in the hills to the east of the [Stony Desert]. Anyone foolish enough to attach the man, is attacked by the Byakhee, rended to pieces, and eaten. * Cave of the Child God - Behind the tree, the shear face of Hatheg-Kla rises another 1000 feet before the cave entrance. A flight of steps, each one foot wide, criss-crosses back and forth up the slope. Anyone nearing the opening hears a deep sobbing and suckling sound as if from some enormous infant. The cave itself is completely black and no light will penetrate it. If anyone enters, a few seconds later, horrifying screams of agony echo from the cave accompanied by sucking, popping sounds and a soft, cooing voice. The screams continue for almost a minute before they are choked off by a gurgling, bubbling sound and a huge spray of blood that shoots from the cave. The character's dream-self is dead, and his waking self has been driven mad by the horrific dreamform of Nemesis.") "Castle of Bombel" (scenario :name "Castle of Bombel" :summary "* To the Castle - The Man on the Mountain has directed the dreamers toward a castle to the east of the [Stony Desert]. The trip takes a few days through the desert and another day throught wooded hills. * The Castle - The rude, three-story castle is in a clearing. It has a single window at the top and a door at the bottom. * Bombel - Near the castle, sitting on a boulder is a huge [Gug]. At the first sign of intruders, it rushes to the attack. * Horella - Shortly after Bombel starts fighting, a foul-looking, scaly ghoul appears in the window. This is Horella, and she immediately begins hurling vile insults and rocks at the Gug. The ghouls are cheered on by her presence, but if someone listens they realize that she is exhorting Bombel to kill the intruders. Dreamers may also notice previous bruises on Bombel's head. If Bombel falls, Horella turns her insults and rocks at her would-be rescuers. Any remaining ghouls grab a chain from their bags, say 'To the rescue', capture Horella, and drag her bumping down the stairs. The ghouls bid farewell and will offer the page as a reward for the dreamers help."))) "Nemesis: Spawn of Azathoth" (section :name "Nemesis: Spawn of Azathoth" :scenariomap (scenariomap "Trip to Darjeeling" (scenario :name "Trip to Darjeeling" :summary "* Francis Wilson - Francis is one of the Tuesday Night Academy. He was at Phillip's funeral and he has been in Russia researching the Tunguska Blast and its possible relationship to Nemesis. He has made some discoveries and sends a telegram to Judge Braddock who forwards it along. The message says to leave immediately for Darjeeling, India and to meet Colonel Hugh Huntley of the British Foreign Office. * Darjeeling - * Colonel Hugh Huntley - Francis has arranged with the British Foreign Office to allow the investigators to travel to Lhasa, Tibet to aid him in his research. Colonel Huntley provides them with papers and can help arrange transport to the British Legation in Lhasa where Francis Wilson is staying. * Road to Lhasa - The 400 mile journey to Lhasa can only be taken on foot or via horse-drawn caravan. The route is heavily trafficked by pilgrims, traders, smugglers, and spies. The journey takes weeks and is alternately terrifying, boring, facinating, cold, and misery-making. * Lhasa - Lhasa is a sprawling squat city with no building taller than 2 stories except for the Potala, the home of the Dalai Lama. The Potala is a bulky, stone structure that is imposing but unattractive. * The British Legation - The Legation is on the outskirts of Lhasa. Here Francis Wilson has residence. He seems thinner and more stressed than at the funeral. He has been researching the Tunguska Blast and mad Rasputin's apparent presence at the blast. After piecing together his research, he illegally entered the Soviet Union and stole parts of Rasputin's journal. He then fled to Tibet through Mongolia. He has been translating sections since then. He claims that Rasputin met someone called Eibon in his dreams, and that this Eibon told him of his own death. Eibon also warned him of a dark star that would fall from the sky. This Eibon gave him a stone that he used to destoy the star. He further foretells another dark star that would fall long after Rasputin's death in Tibet. Francis guesses that the location may be near an abandoned temple roughly 300 miles north of Lhasa. He has found a guide Lha-bzang who studied in the temple as a child. * Lha-bzang - Francis plans to travel there soon with a native Tibetan, Lha-bzang. Lha-bzang is a domden, a Tibetan mortician. A skilled Anthropologist may recall that Tibetan funeral rites involve the corpse being hacked to bits by the axe-wielding domden and then fed to ravens or vultures. Lha-bzang's dream form is the holy man on the mountain. Lha-bzang is going on the journey to expand his spiritual understanding. Unfortunately, he has also been paid off by a Soviet spy. If questioned about the temple, he says he was sold as a slave as a child but he fled the temple when he realized that their teachings were not Buddhist. * Ivan Dorkyev - A Soviet spy who has been tracking Francis down since Francis stole Rasputin's journal in Leningrad. He is over 6 feet tall and is dressed in the tattered robes of a yak-herder. Beneath, he carries two pistols, a knife, and a bandolier of ammo. He hides at his camp in the mountains near the ruins waiting for Lha-bzang to bring Francis. * Trip to the Ruins - Lha-bzang leads the expedition 300 miles through a tangle of steep mountain passes, brackish lakes, and arid valleys. On the way, they encounter kay-herders, small mountain monasteries, and moutain farms. About 2 weeks in to the trip, while camped, a minor earth tremor shakes everyone awake. A week laker, they arrive at the Nenmka temple, sitting on the slope of a mountain. * The Temple - The temple is now just a windswept ruin. A Mythos knowledge test reveals that the fallen columns have inscriptions used to invoke Hastur. The Soviet spy has watched the investigators approach and waits in hiding nearby. Lha-bzang finds a section of flooring with symbols on a tile. Here he will perform a ceremony to discover more about Nemesis. * The Ceremony - Lha-bzang sits and lights a clay pipe containing a tarball of hashish. He passes the pipe around and then begins a droning wail. After 30 minutes, he retrieves a knife and a freshly severed human hand from his bag. He cuts his own palm, smears blood on the hand, and binds the cut. He then passes the knife to each person to do the same. If any will not, he gestures for them to leave the prayer circle. After another 5 minutes, the hand twitches and then turns toward Lha-bzang. He asks where can they find the Seed of Nemesis. The hand then crawls to a symbols on the ground indicating 'not far' and 'north-east'. Additional questions may be asked but each question causes the questioner to receive a minor Sanity Wound. Answers are always very short, and the hand only knows local events. The Soviet spy waits nearby but has accepted Lha-bzang's demand to allow the ceremony to complete before acting. * Confrontation - Just as the ceremony is concluded, Ivan steps into the room brandishing his pistols and warning everyone to stay where they are. He is deadly serious and will gun down anyone who makes sudden movements. Ivan plans to take Francis back to the Soviet Union to stand trial for the many laws he has broken and suspiscion of being a spy. He has no knowledge of Nemesis and has nothing but contempt for the superstitious, religious ritual. If given the chance, he will tie up the investigators and then take Francis and Lha-bzang (his ally) in the morning. * The Fallen Seed - In the early morning, everything changes. Along with the bright sun, a halo forms in the sky, though this halo does not surround anything visible, yet. Dorkyev is thunder-struck; he and Francis exchange words in Russian. Ever the pragmatist, Dorkyev frees everyone and begins a descent toward the valley under the halo. Within the valley, the halo light is flat and oily, and its color melts through shades of yellow and green as though through a prism. Lha-bzang vomits and flees. Suddenly, all present feel their hair stand on end as the halo darkens and takes on a dull gun-metal hue. The slight wind disappears and everything is silent. Then, high above a sizzling sound grows in intensity. Suddenly a hideous scream is heard followed by a thunderous blast that knocks everyone off their feet. Everyone suffer partial hearing loss and if a check versus [Body] is completely failed, the loss is permanent. A blinding light rips through the sky and crashes to Earth over the valley ridge that Lha-bzang crossed. A massive explosion rocks the ground and a curtain of flame passes overhead. If not for the ridge, everyone would have been incinerated along with Lha-bzang. * Crater - Peeking over the ridge, a 20 foot crater can be seen with a sickly, green light emanating from it. Wilson frantically says that Eibon's symbol must be placed on the Seed or it will destroy the Earth. Those who have witnessed the Seed in Montana know that any who approach the Seed will die: quickly or slowly. If no one volunteers and no one has a plan, Dorkyev swears, snears of their cowardice, and takes the jewel to the crater. Alas, just as he climbs the crater and is exposed to the light, he screams and immediately melts into a puddle before everyone's horrified sight. Worse, he drops the jewel into the crater. If someone uses a mirror, they can see the jewel near the Seed which is slowly melting the rock around it with its terrible power. Wilson adamantly refuses to go (and will melt if pushed), so someone will have to sacrifice themself or watch the Seed sink into the ground and doom the world. * Eye to Azathoh - The doomed person must resist the corrupting rays, retrieve the jewel, and then touch it to the Seed. Nothing happens for a few moments, then the Seed suddenly shimmers and disappers with a sharp pop. The Seed is gone but a black, marble tunnel lies in its place. The jewel lies on the ground before the tunnel. Hyperborean symbols line the tunnel. This is Eibon's work. When the jewel crosses the threshold, it suddenly reverts to the heavy glowing stone from the Dreamlands. There is a steady breeze down the tunnel and a light can be seen ahead. After 100 meters, a room 250 meter, circular opens up. The room is the exact same shape as the jewel. The breeze has become a howling gale ending in a 5 meter gateway in the center of the other end of the room. The gateway in the center of the oval room gives the impression of an eye looking out into space. * Gateway - The gateway can be reached by a ramp that slopes upward 50 meters. Stars can clearly be seen through the opening, and it is clear that the gate leads directly into outer space. Anyone who has been exposed to the Seed radiance, has an intense desire to go through the gate and join Nemesis. Anyone approaching the gate will need ropes or climbing skill to cling to the reliefs on the floor or be sucked into oblivion. Also, the jewel gains weight as it approaches the gate, as if it is resisting, eventually becoming over 100lbs. If someone can get close or has binoculars, that person will see that the area of space beyond the portal is filled with criss-crossing black lines forming a faint web. Someone may recognize the black substance and The Black associated with Yibb-Tsll. This is Eibon's Web taught to him by Yibb-Tsll. Within the web, an observers intuitively senses that time is slowing to a crawl. Further, the web is creeping through the portal into our world. This is how mad Eibon hoped to save mankind, by freezing us forever in time, so Nemesis can never destroy us. * The End - If the jewel is brought near the gate, in addition to its increased weight, the Black lines start to reach toward the jewel. Simply hurling the jewel through the portal will gather all the webs onto the jewel which breaks the spell of Eibon. If anyone returns to the Stony Desert, they will no longer find Eibon there. The world will no longer be trapped forever in frozen time, but Nemesis will still return some day to end the world, but it will not be today.")))) :unitmap (unitmap "Julian Baxter" (unit :name "Julian Baxter" :summary "* Julian Baxter is a priest and brother of Phillip Baxter. He is confined to a wheelchair and is heavily dependent on his son Matthew. Before becoming a priest, Julian was educated as a psychotherapist. He has traveled the world on missions, but since becoming crippled he has returned to his home town. * Julian has a copy of the Book of Eibon in his library. It has a section where Eibon fortells the end of mankind with the coming of Nemesis. Eibon was obcessed with preventing man's destruction and spent the rest of his life developing a ritual call the Web of Fate that would supposedly save mankind when the time was right. Eibon claims that as Nemesis approaches, the Web of Fate will draw together seemingly unrelated events, defeat Nemesis, and create an eternal golden age for mankind. The reading clearly shows Eibon's progressive descent into madness.") "Matthew Baxter" (unit :name "Matthew Baxter" :summary "* Matthew is the adopted, grown son of Julian Baxter. He is strong, but he is also mute and aeuteistic. This combination makes him appear simple, but he is actually quite competent. He is an avid dreamer where there is no trace of his aeutism. In dreams he is a city council member in Ultar. He can be a strong ally, but he must be approached in the Dreamlands, as it is impossible to gain his friendship in the real world.") "Silas Patterson" (unit :name "Silas Patterson" :summary "* Silas is a friend of both Phillip and Julian Baxter, a past professor at Brown University, a former antrhopologist, and a member of the Tuesday Night Academy. He is quite fit considering his age. * Silas met Julian Baxter in the Congo in 1904 and became friends. In 1919, he met Cynthia Baxter, Julian's niece in the Andaman Islands. In 1920, he came to Providence where he met Phillip and joined the Tuesday Night Academy. Phillip soon after helped him get a teaching position at Brown. * Silas practices a form of cannibalism he learned in New Guinea at the instruction of a degenerate Tcho-Tcho priest. The ceremony involves eating the brains of a recently slain primate to gain extended life. This habit made him lose his job at Brown when it was discovered that he was stealing monkey corpse from the lab. He has since made an arrangement with a local undertaker with low moral character, Alvin Beswick. Silas told Beswick that he was performing brain research, but Beswick is just concerned with the money. Beswick allows him access to closed coffin corpses for a price. He was given access to Phillip's corpse and noticed the small bite marks on the scalp. While devouring the brain, Phillip suddenly lurched back to consciousness and thrased wilding before dying. Silas was terrified and is wracked with guilt over his friend's death. He is maintaining his sanity through denial, and if he is forced to confront what he has done, he will retreat inward and become catatonic and need to be institutionalized. * Silas is friendly, but he not only knows his role in Phillip's death but is reasonably sure that Cynthia was involved. He is planning to return to the Andaman Islands to investigate Cynthia's activities and also because it is getting hard to hide his youth in Providence. * In Sila's desk can be found notes for his next book, about cannibalism. The notes indicate that Silas is unbalanaced. In his files can be found the lease to a farmhouse. * Investigating the farmhouse, leads to the table where Phillip met his end. No attempt has been mde to cover up the crime."))))))) "Kingdom of the Gods" (chapter :name "Kingdom of the Gods" :sectionmap (sectionmap "Kingdom Undead" (section :name "Kingdom Undead" :itemmap (itemmap "Resurrection Herb" (item :name "Resurrection Herb" :summary "* This rare herb is believed to return the dead to life. Actually, it is the tiny worm eggs that grow on the plant that infect the host and turn them into a zombie. * Infection - The worms can infect a living host if worms, their eggs, or infected flesh are eaten (even cooking is not a guarantee of safety) or the worms transfer via an ghoul bite. A recently deceased host may also be infected if the eggs are injected directly into the brain. * Transformation - Once infected the worms rapidly multiply by division and move through the body. Once fully infected, the worms act as replacement nervous system, stimulating the cells and retarding cell death. The worms stimulate the primitive sections of the brain to cause it to seek more hosts for the worms. The When they first activate the body, its movements are jerky and extreme, but the body quickly adapts and becomes quite agile over time. * Pack - The worms are a colony creature and are aware of nearby worms in infected creatures. They, therefore, do not attack other infecteds and tend to collect together in groups. * Intelligence Level - Though they are savagely murderous and largely fearless, they do retain an animalistic survival instinct and take shelter and avoid fire and heat which would kill their worms.")) :unitmap (unitmap "Kingdom Ghoul" (unit :name "Kingdom Ghoul" :summary "* Strengths: ** Agility and endurance: In some scenes, they were able to bring down a full-size horse and nearly match the speed of one for short, sustained periods of time. ** Short incubation period: It takes about 15 seconds to 1 minute for a victim to turn into an undead zombie. Making them effectively at multiplying and overwhelming urban centres. However, this can vary. One main character was able to resist the infection for over 2 minutes. ** Durability: It has been observed that even if their internal organs are exposed or took a direct stab from a sword to their chest, this doesn't kill them. ** Heightened sense of smell: A fresh drop of blood from an uninfected human can attract other infected bodies many meters away. * Weakness: ** Decapitation: They're capable of taking damage that would be fatal to most men. It was found that decapitation or destruction of the head is the most effective in killing them. ** Aversion to water bodies: It has been observed they will generally avoid travelling on water bodies. They have no ability to swim, and when they are pushed into deeper waters, they will immediately sink to the bottom. ** Heat: They have been observed to immediately seek shelter when the day begins to break in order to escape the heat of direct sunlight. As a result, during spring or summer, they are only active during the day and hibernate at night. ** Fire: Fire can be used to keep infected at bay. ** Reduced vision: The milky eyes limits their vision to basic movements, so they rely on smell and hearing to hunt. ** Blood: Blood can be used to distract or bait the zombies to behave in certain ways. Although dangerous, using fresh blood on rooftops is shown to be an effective means to lure zombies if needed."))))) "Night of the Living Dead" (chapter :name "Night of the Living Dead") "Serial Killers" (chapter :name "Serial Killers" :sectionmap (sectionmap "Unstoppable Killer" (section :name "Unstoppable Killer" :reference "* Friday the 13th, Nightmare on Elm Street"))) "Deadly Beasts" (chapter :name "Deadly Beasts" :reference "* Jaws, Phase IV, Them"))))
nx/tactics/books/land_sea_and_air
Description:
Package Name:
  • nx/tactics/books/land_sea_and_air
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
Functions:
  • tacticsbook
Source Code:
  • (package nx/tactics/books/land_sea_and_air :libs (lib base :path nx/tactics/base)) (func tacticsbook : base/book (book :name "Land, Sea and Air" :image "LandSeaAndAir.jpg" :chaptermap (chaptermap "Land, Sea and Air Overview" (chapter :name "Land, Sea and Air Overview" :sectionmap (sectionmap "Why Tactics:Land, Sea and Air?" (section :name "Why Tactics:Land, Sea and Air?"))) "Land Sea and Air Unit Types" (chapter :name "Land Sea and Air Unit Types" :sectionmap (sectionmap "Strategic Movement" (section :name "Strategic Movement"))) "Land Sea and Air Rules" (chapter :name "Land Sea and Air Rules" :sectionmap (sectionmap "Vehicle Construction" (section :name "Vehicle Construction" :rulemap (rulemap "Choose Vehicle Type" (rule :name "Choose Vehicle Type" :summary "* Cycle * Car * Truck * Bus/RV * Helicopter * Airplane * Boat * Submarine Trailers !Abilities 50% Cost, 200% Load, -1 Handling !Units * Sidecar - Mini * Light Trailer * Medium Trailer * Heavy Trailer * Semi Trailer Cycles !Bicycles * Tricycle * 3 Speed Bicycle * 10 Speed Bicycle * Racing Bicycle ** Weight: 40lb. Top Speed: 40mph. Cargo 1cf. Max load 30lb. Cost $400. * Rikshaw Cycle !Motorcycles * Mini Cycle * Scooter * Sport Cycle * Racing Cycle * Cruising Cycle * Chopper ** RWD, driver and passenger. Top Speed 150. 50 mpg. Cargo 1 cf. Max load 50 lb. Cost: $5,000. Weight: 300 lb. !Trikes !Options * Sidecar * Trailer * Saddlebags Cycles - Body 25% Weight, 25% Cost, 25% Load * Dirt Bike - Personal Body * Sport Cycle - Light Body, Sport * ATC - Medium Fiberglass Body * ATV - Heavy Fiberglass Body * Road Hog - Heavy Body Cars * Midget Racer - Personal, Stripped * Formula One - Mini, Sport, Stripped * Subcompact - Mini * Cooper - Mini, Sport * Compact - Light * Dune Buggy - Light, Offroad, Stripped * Trike - Light, Fiberglass * Sportscar - Light, Sport * Mid-Sized - Medium * Light SUV - Medium * Station Wagon - Extended * Luxury - Extened, Luxury * Limosine - Heavy, Luxury * Police Cruiser ** Very similar to a four-door mid-sized passenger sedan. Always RWD, with maybe 250 hp, driver, gunner, three prisoners (passengers). SR 4.75, TS 155, AC 9 (max 20), 19 mpg@65. No Armor. Cargo 20 cf. Max load 300 lb. $35,000, 3600 lb. Each police cruiser will have at least one shotgun. * Cars ** Subcompact Car *** FWD, two-door or four-door. Two to five passengers. Top Speed 100mph. 30mpg. Cargo 15 cf /225 lbs. $15,000, 2350 lb. ** Compact Car *** FWD with around 130 hp, two- or fourdoor. Four to five passengers. SR 5.25, TS 120, AC 6 (max 10), 27 mpg@65. No Armor. Cargo 20 cf. Max load 300 lb. $20,000, 2800 lb. ** Mid Sized Car *** FWD or RWD, with around 180 hp, two- or four-door with four to five passengers. SR 5.5, TS 130, AC 6 (max 11), 22 mpg@65. No Armor. Cargo 20 cf. Max load 300 lb. $26,000, 3300 lb. ** Station Wagon ** Luxury Car ** Mini Van") "Choose Frame" (rule :name "Choose Frame" :summary "* [Personal Frame] - Passengers can only be carried as cargo. * [Mini Frame] * [Light Frame] * [Medium Frame] * [Extended Frame] * [Heavy Frame] * [Extra Heavy Frame] * [Super Heavy Frame] * [Sport] * [Racing] * [Utility] * [Luxury] * [Heavy Duty] !Modifiers * Standard - the default for all cars is the standard body style. Up to 40% of their internal space may be devoted to weapons. * Stripped - 75% Weight, 75% Cost, No Armor. All exrtas like lights and air bags are removed. * Utility - 75% Cost, -1 Handling * Sport - 150% Cost, 120% Top Speed, +1 Handling, 75% Load * Racing - 300% Cost, 150% Top Speed, +2 Handling, 50% Load * Luxury - 150% Cost, +1 Handling ** Power everything, ABS, High quality Air bags, etc. * Heavy Duty - 150% Cost, 150% Load * Offroad - 150% Cost, -1 Terrain Penalty * Cheap car body - made from rough steel with crude weld points but is cheaper than the standard body. For every cf. of space a cheap car body costs $10, weighs 6 lb, yet has a maximum load of 28 lb. A car body made with cheap materials adds .25 to SR (see below). * Standard car body - consists of a basic unit-body construction of galvanized steel and steel alloys. For every cf. of space a standard car body costs $15, weighs 6 lb and has a maximum load of 29 lb. * Expensive car body - is an advanced design using high-tech alloys and reinforced plastics. For every cf. of space an expensive car body costs $25, weighs 6 lb, and has a maximum load of 30 lb. A car body made with cheap materials subtracts .25 from SR (see below). * Extra light (XLT) construction - adds 100% to the current body cost but reducing body weight by 25%. Cars with XLT bodies take 50% more damage in a collision. * Low Profile - cars that are low profile have been flattened so that their width and length are somewhat greater in proportion to their height. Many sports cars and limousines may be considered low profile. This makes them harder to hit and they handle better because of a lower center of gravity, but because they have less surface area they cannot mount as many weapons. -1 to hit, -0.5 SR. Only 25% of internal space may be used for weapons. * Very Low Profile - cars that are very low profile have been flattened so that their width and length are much greater in proportion to their height. Many exotic sports cars like the Lamborgini are very low profile. This is simply an extreme version of low profile. -2 to hit, -1 SR. Only 10% of internal space may be used for weapons. * High Profile - cars that are high profile are tall in proportion to their width and length. Many sport-utility vehicles and all vans may be considered high profile. +1 to hit, + .5 SR. Up to 75% of their internal space may be devoted to weapons. Space taken up by ammunition does not count against the amount of space a vehicle may use for weapons, only the weapons themselves counts against this. * Sport Model - Compacts or Mid-Sized only. The car is a &quot;sports&quot; car with only room for two, a driver and a single passenger. +30mph adds aerodynamic streamlining. A Sport body costs 100% more, subtracts .25 from SR, weighs 5% lighter, and adds 10% to final top speed and mileage. * The Utility option has one purpose: cheaper is better. Utility bodies are 30% cheaper, add .25 to SR, and subtract 15% from their final top speed and mileage. * The Sport Utility option adds aerodynamic streamlining to a heavier, cheaper frame. A Sport Utility body costs 60% more, adds 10% to final top speed and mileage, but adds .25 to SR.") "Choose Mass" (rule :name "Choose Mass") "Choose Engine(s)" (rule :name "Choose Engine(s)" :summary "** [[Unpowered]] ** [[Wood Burning Engine]] ** [[Coal Fired Engine]] - 35% Efficiency, 30 MJ/kg ** [[Battery Powered]] - 85% Efficiency ** [[Gasoline Engine]] - 20% Efficiency, 45.8 MJ/kg, .41 kW/kg Power / Weight ** [[Diesel Engine]] - 25% Efficiency, 45.3 MJ/kg (denser than Gasoline with 15% more energy by volume), .41 kW/kg Power / Weight (Turbocharged V8 Diesel) ** [[Natural Gas Engine]] ** [[Hydrogen Fuel Cell]] ** [[Jet Engine]] - 43.7 MJ/kg ** [[Rocket Engine]] - 70% Efficiency, 164 kW/kg Power / Weight (Space Shuttle) ** [[Nuclear Plant]] ** [[Fusion Plant]] * Cheap - $8, 5 lb, 0.2 cf. * Normal - $20, 4 lb, 0.18 cf. * High Output (HO) - $35, 3 lb, 0.15 cf. * Super High Output (SHO) - $50, 2.5 lb, 0.13 cf. * Exotic (EX) - $75, 2 lb, 0.11 cf. An engine has 1 hit per 2 full cubic feet. The smallest possible engine is 25 hp. A car may mount more than one engine, but may only use one at a time. * Turbocharger - This device uses the engine's exhaust stream to drive an air compressor which increases the engine's power output. It is not possible to fit a Supercharger and a Turbocharger into the same vehicle. +20mph, minor option.costs 50% of the original engine cost, weight is 10% of the original engine weight. A Turbocharger adds 30% to hp. No more than four turbochargers may be added to an engine. * Supercharger - A supercharger uses a belt and pulley mechanism linked to an engine's crankshaft to force extra air and fuel into the engine's combustion chambers, greatly increasing engine power. It is not possible to fit a Supercharger and a Turbocharger into the same vehicle. +20mph top speed +10 Acc. Costs 100% of the original engine cost, weight is 15% of the original engine weight. Adds 65% to total hp and one hit to the engine. May be combined with turbochargers, but if even one turbocharger is added the Supercharger only adds 40% to total hp. * Nitrous oxide may be purchased for $500, 15 lb. When fired (like a weapon), this system injects Nitrous Oxide gas into the combustion chamber. This gives a brief but enormous boost to speed. For a single turn per use, the vehicle's acceleration is increased by 30. This acceleration can be used to boost a vehicle's speed to over its normal Top Speed, but on the following turn it must reduce speed down to the Top Speed. 3-shot +30mph acceleration, minor option, destroyable More than one may be mounted but the effects of using two or more are not cumulative. * Computerised Engine Management - An electronic system which constantly monitors and tunes the engine as it is running, in order to maximise performance. +10 Acceleration, minor option, destroyable. * Engine Rebuild - Also known as &quot;blueprinting&quot;. The engine has been taken apart and re-assembled to within the most exacting tolerances, and certain production items replaced with high performance alternatives. +20mph top speed, minor option. * Fuel Injection - An advanced system which replaces the carburettor, giving a significant boost to performance. It is not possible to fit a Fuel Injection system and a Multicarb into the same vehicle. +20mph top speed +10mph Acc 2 minor options. * Multicarb - A multi-barrelled carburettor designed to give superior performance over the standard single barrelled carb. It is not possible to fit a Multicarb and a Fuel Injection system into the same vehicle. +20mph, minor option.") "Choose Travel Modes" (rule :name "Choose Travel Modes" :summary "** Land *** Wheeled *** Tracked *** Walker ** Marine *** Sail *** Prop *** Catamaran *** Hydrofoil *** Airboat - Steering is by rudders. No brakes or reverse. *** Hovercraft *** Submarine ** Ice *** Ice Sailboat *** Aerosan - Ice Airsled ** Air *** Propeller *** Jet *** Helicopter *** Rocket ** Space *** Rocket *** Magnetic Ion *** Hyperdrive *** Space Fold * Aquatic * Submersible * Glider * Propeller * Jet * Suborbital * Orbital * ExtraOrbital * Interplanetary - Can endure the rigors of interplanetary space for months if necessary. Completely self contained and recycling environment and food supply. * Interstellar - Can endure the rigors of interstellar space for years if necessary. Completely self contained and recycling environment and food supply. All cars have four wheels. Each wheel has (body space/20) hits, rounded down. Wheels may be reinforced to take more damage than they would normally be able to. This costs 35% of body cost and doubles the number of hits for each wheel. Wheels may be made fire-proof (FP) for an extra 10% of body cost. * High Preformance Tires - cost 40% of body cost, and subtract .25 from SR. Racing tires cost 100% of body cost, and subtract .5 from SR. * Racing Slicks - Racing style tires, with no noticeable tread pattern. Great for improving traction in dry conditions on the racetrack, lousy if it's wet, on a real road or off-road. +2HCon &quot;clean&quot; dry asphalt, -1HC on typical roads, -2HC off-road or on wet asphalt. * Spare tires count against the car's max weight and space. Each spare tire costs 20% of body cost, weights 5% of body weight, and takes up 1% of body space. A spare may be mounted on any side externally. This option costs an additional $100, but takes up no internal space. All external spares take damage BEFORE the armor they are mounted on, however if they take more than 3 hits of damage in a single round they fall off, effectively removed from game play. Spare tires may not have wheel guards. !Drivetrain * Rear wheel drive (RWD) is the standard drivetrain that comes with a vehicle design. * Front wheel drive (FWD) is a drivetrain option that reduces final body cost and weight by 15%. FWD adds .25 to SR. * All wheel drive (AWD) is a drivetrain option that increases final body cost by 100% and weight by 10%. +2HC on ice, oil, wet roads or offroad.") "Choose Maneuverability" (rule :name "Choose Maneuverability" :summary "* Human Interface - Physical skills in a vehicle are generally limited by how closely the vehicle matches the human body unless a particular piece of hardware is installed to enable the specific skill. ** Land *** Aerodynamics *** Suspension *** Terrain Modifications *** Traction ** Air *** VTOL *** Jumpjets *** Booster Rockets ** Space *** Verniers !Suspension * Sporty - For 50% of the final body cost a vehicle's suspension may be upgraded to Sporty. These better arms and shocks decrease SR by .25. * Sport - For 100% of the final body cost a vehicle's suspension may be upgraded to Sport. These superior coils, struts, and frame stiffening decrease SR by .5. * Racing - For 175% of the body cost the suspension may be upgraded to Racing, with complete body stiffening, automatic camber adjustment, and computer controlled shocks. Racing suspension decreases SR by one. * Off Road Suspension - Heavy duty suspension with a higher than usual ground clearance. Allows vehicle to pass Rough Terrain without penalty and to pass through Punishing Terrain. * Computer Assisted Suspension - An electronic system which monitors and adjusts the suspension in order to give a smoother, more stable ride. +1 HC minor option, destroyable.") "Choose Fuel and Range" (rule :name "Choose Fuel and Range" :summary "** External Fuel Tanks ** Propellant / Reaction Mass (spacecraft) * Gas Tank - $10 per gallon, weighs 7 lb (full) per gallon. Gas costs $2 a gallon. If a car runs out of gasoline (or a car's gasoline tank or engine is destroyed) the car may not accelerate and automatically decelerates by 5 mph per second. * Armored Gas Tank - $15 per gallon, weighs 12 lb (full) per gallon. * Self-sealing Gas Tank - $20 per gallon, weighs 10 lb (full) per gallon. Self-sealing gasoline tanks cannot explode when hit, but can explode when the vehicle is on fire. * Self-sealing Armored Gas Tank - $40 per gallon, weighs 15 lb (full) per gallon. Self-sealing armored gasoline tanks cannot explode.") "Choose Mission Specific" (rule :name "Choose Mission Specific" :summary "** Cargo Bay ** Decoys ** ECM/EW ** Hanger Bay ** Passenger Space - Passenger space is relative to the number of passengers, the operating range, and the relative luxury of the craft. ** Sensors ** Stealth ** Cloak !Cargo Cargo space is (usually) your leftover space: space not taken up by people, guns, or equipment. * Hidden Cargo Space - Up to half the cargo space in the vehicle is in hidden compartments. Handy in the event of &quot;Imperial Entanglements&quot;. Minor option, destroyable * Flatbed - Cargo space designated as a &quot;flatbed&quot; is exposed to the open air, but can carry twice the normal load. * Another vehicle may be put into cargo space, if the vehicle's Maximum Cargo Load is great enough. Any car placed in cargo of another car exits via the standard cargo access (usually the back), and suffers a Turn III in doing so.") "Choose Armor" (rule :name "Choose Armor" :summary "** Command Armor ** Radiation Shielding !Armor * Armor is applied to the six sides: Front, Left, Right, Back, Top, and Under. Armor for vehicles is spaced in layers of sheets 1/4&quot;-1&quot; apart and consists of a standard ablative carbon-reinforced plastic. This material is light and very strong, and can be shaped into any form, however it's ablative attribute has it's limitations. * Normal armor costs cubic feet divided by 10 and weighs (cubic feet divided by 30) + 5 per point. * Sloped (SLO) armor angles the plates under the skin of most of the vehicle, making it more efficient. Sloped armor costs cubic feet divided by 8 and weighs (cubic feet divided by 38) + 5 per point. * Chambered armor (CA) consists of tactically placed spacing between layers of high-quality sloped armor. This design costs cubic feet divided by 5 and weighs (cubic feet divided by 46) + 5 per point. * Options: Fireproof armor (FP) - Costs twice as much as regular armor but prevents the car from catching on fire, unless the armor becomes breached. * Laser Reflective (LR) Armor - Costs 3 times as much as normal armor but cuts all damage from lasers in half (unless the side hit is breached). * The combination of LR and FP armor (LRFP) costs 5 times as much as regular.") "Choose Weapons" (rule :name "Choose Weapons" :summary "!Aimed Weapons All aimed weapons come standard with a heavy transversal mounting, and an autoloader, allowing a high-degree arc of fire and an uninterrupted ammunition supply. This in turn makes them very versatile and powerful yet much bigger and heavier than normal. Aimed weapons can be mounted on the front, back, right, or left side of the car. Armed weapons may also be mounted in a turret on the top of the body. * Arcs of fire ** Hand Weapons *** The driver of a vehicle may fire directly ahead, or up to 90 degrees to the drivers side. *** The front passenger of a vehicle may fire in a 180 degree arc from directly ahead to directly behind. *** Rear passengers of a vehicle may fire directly behind, or up to 90 degrees to the side that they are on. *** Passengers standing up in a sunroof may fire in a 360 degree arc around the vehicle. *** Occupants in a convertible may fire in a 360 degree arc, except for the driver who is limited to the 180 degree forward arc. ** Mounted Weapons *** Door mounts fire into a 90 degree arc measured from the adjacent side or rear square. *** Pintle mounts fire into a 180 degree arc, either forward or rear. *** Fixed mount - directly ahead, and 1 square (50mm) either side of directly ahead (in effect a 3 square (150mm) wide fire corridor) *** 180 Turrets are must be specified as either Forward or Rear facing *** 360 degree mounts can fire in any direction. * Machine Guns The machine gun has been the mainstay of every army since the dawn of the 20th century. Light and cheap yet with a high rate of fire, they are very effective in high speed combat. The Gatlingstyle machine guns are a more recent design, and can devastate an opponent in seconds. ** Option: Super High Density (SHD) ammo - Cost x 10, +25% weight, +1/die damage. ** Machine Gun .223 (MG22) - To hit 11, 1d-4 damage, 1 hit. Cost $1200, weight 40 lb, 5 cf. Ammo costs $100, 80 lb, and has 100 seconds of ammo per cf. ** Machine Gun .30 (MG30) - To hit 11, 1d-2 damage, 2 hits. Cost $1950, weight 70 lb, 9 cf. Ammo costs $200, 50 lb, and has 50 seconds of ammo per cf. ** Machine Gun .50 (MG50) - To hit 11, 1d+2 damage, 4 hits. Cost $4200, weight 200 lb, 14 cf. Ammo costs $500, 50 lb, and has 20 seconds of ammo per cf. ** Chain Gun .50 (CG5) - To hit 12, 2d+1 damage, 4 hits. Cost $6000, weight 210 lb, 22 cf. Ammo costs $500, 50 lb, and has 12 seconds of ammo per cf. ** Automatic Shotgun ** 20 mm Autocannon (AC) - To hit 12, 5d+1 damage, 6 hits. Cost $28900, weight 850 lb, 60 cf. Ammo costs $250, 20 lb, and has 2 seconds of ammo per cf. Burst effect. * Cannons ** Option: Armor Piercing (AP) ammo - Cost x 3, +15% weight, +4/die damage. ** 20 mm Anti-Tank Gun (ATG) - To hit 11, 2d+4 damage, 4 hits. Cost $5500, weight 460 lb, 38 cf. Ammo costs $250, 20 lb, and has 10 shots per cf. Burst effect. ** 35 mm Cannon (C35) - To hit 11, 4d+10 damage, 7 hits. Cost $15600, weight 700 lb, 56 cf. Ammo costs $400, 20 lb, and has 6 shots per cf. Burst effect. ** 60 mm Cannon (C60) - To hit 11, 7d+15 damage, 7 hits. Cost $31100, weight 1320 lb, 75 cf. Ammo costs $750, 20 lb, and has 4 shots per cf. Burst effect. * Laser Weapons - Heavy and expensive yet extremely accurate and powerful, lasers offer a decisive advantage to their wielder. This advantage is balanced by the expensive laser-reflective armor available. ** Option: Infrared Modulation - Laser cost x 1.5, same weight, no penalty for firing through smoke. ** Light Laser (LL) - To hit 14, 1d-3 damage, 2 hits. Cost $5000, weight 125 lb, 10 cf. Has 30 shots from a rechargeable battery. ** Laser (L) - To hit 14, 2d-1 damage, 2 hits. Cost $10000, weight 350 lb, 25 cf. Has 30 shots from a rechargeable battery. ** Heavy Laser (HL) - To hit 14, 4d-1 damage, 3 hits. Cost $22000, weight 675 lb, 40 cf. Has 30 shots from a rechargeable battery. * Flame-Throwers - Used as anti-tank weapons and bunker busters for decades, these fire breathers are more efficient and longer range than their predecessors. ** Light Flame-Thrower (LFT) - To hit 13, 1d-1 damage, 2 hits. Cost $2500, weight 85 lb, 10 cf. Ammo costs $30, 40 lb, and has 4 seconds of ammo per cf. Limited to a 40 yard range. ** Flame-Thrower (FT) - To hit 13, 2d damage, 3 hits. Cost $4000, weight 150 lb, 20 cf. Ammo costs $30, 40 lb, and has 2 seconds of ammo per cf. Limited to a 60 yard range. ** Heavy Flame-Thrower (HFT) - To hit 13, 3d damage, 4 hits. Cost $7000, weight 300 lb, 35 cf. Ammo costs $30, 40 lb, and has one second of ammo per cf. Limited to a 80 yard range. * Grenade Launchers An automatic version of the popular infantry weapon. The gunner has the choice of attacking the target side of a vehicle or of attacking the top of the target at an additional -1 to hit. Used in this manner, the grenade launcher (other than the mortar, see below) is the only weapon that may fire OVER another car or obstacle, with no line-ofsight. ** Options: Incendiary - Cost $650 per cf of ammo. ** 40 mm Grenade Launcher (GL) - To hit 10, 2d damage, 3 hits. Cost $2850, weight 275 lb, 20 cf. Ammo costs $500, 45 lb, and has 30 shots of ammo per cf. Maximum range 100 yards. Burst effect. * Mortars - An infantry mainstay, somewhat inaccurate but extremely effective. Because of the general attempt of the gunner to place a mortar near the target, the gunner has the choice of attacking the target side of a vehicle or of attacking the top of the target at an additional -4 to hit. Similar to the 22 grenade launcher, the mortar may fire OVER another car or obstacle, with no line-of-sight. ** Options: White Phosphorus (WP) - Cost x2. ** 80mm Mortar - To hit 9, 6d damage, 4 hits. Cost $6500, weight 750 lb, 40 cf. Ammo costs $750, 50 lb, and has 12 shots of ammo per cf. Maximum range 300 yards. Burst effect. * Rockets - Powerful and cheap, rockets are some of the most effective weapons in the game. They also are rather inaccurate. After the first one, each additional rocket of the same size mounted on the same side takes up only 50% of its space and weighs 75% its weight. Rockets have a range of about 1000 yards. All rockets are burst effect weapons. ** Options: Pop-Up (PUR) - Minus 2 damage. Cost +70%. When a PUR hits the target car, the top side receives the damage. ** White Phosphorus (WP) - Cost +20%, -1 damage. ** Optical Target Recognition System (OTRS) - Cost +400%, -2 damage. To hit 9 within 100 yards, but locks on at 100 yards and has a to hit of 16 from there out, with no modifiers for range. ** 45 mm Rocket (R45) - To hit 9, 2d damage, 1 hit. Cost $470, weight 80 lb, 8 cf. Only 1 shot. ** 60 mm Rocket (R60) - To hit 9, 4d damage, 1 hit. Cost $950, weight 160 lb, 12 cf. Only 1 shot. ** 89 mm Rocket (R89) - To hit 9, 6d damage, 1 hit. Cost $2150, weight 240 lb, 16 cf. Only 1 shot. ** 120 mm Rocket (R120) - To hit 9, 8d damage, 1 hit. Cost $4500, weight 320 lb, 20 cf. Only 1 shot. ** Rocket Pod !Dropped Weapons Dropped weapons can only be mounted on the back or sides of a car. A dropped weapon mounted on the side of a car is to the left or right. Any number of dropped weapons may overlap, however, mines mixed with ACFO automatically go off (dealing mine damage to the firing car), but regular oil that comes into contact with ACFO does NOT ignite. * Mine Dropper (MD) - 2 hits, $1000, 50 lb, 15 cf. When a vehicle goes within the range of a mine (a 2 yard radius), each wheel takes 1d damage and the underbody takes 2d+6 damage. Each mine is $100, 20 lb, and .5 cf. Burst effect. ** Option: Claymore Mine (CM)- Costs $200 per cf., however when a claymore is dropped the direction of the blast must be specified. Claymores may be set to attack the bottom, left, right, front, or back of a vehicle. When a vehicle goes within range of a claymore the side specified takes 3d+2 damage. * Oil Jet (OJ) - 3 hits, $300, 20 lb, 5 cf. Causes a 5 yard-radius oil slick to fill the road when fired. Driving over oil is a Turn III. Ammo costs $30, 40 lb, and has 5 shots per cf. ** Option: Air-Contact Flaming Oil (ACFO) - Costs $1000 per cf, same as regular oil, but for every second a car is on the flaming slick it must roll as per a flame weapon on each tire and the underbody. ACFO burns out in 20 seconds. * Paint Sprayer (PS) - 2 hits, $500, 75 lb, 10 cf. Causes a 5 yard-radius paint cloud when fired. Ammo costs $100, 30 lb, and has 8 shots per cf. Paint dissipates in 3 seconds. Normal smoke penalty to 23 shoot through and if a car touches it treat that car as if it was night for the rest of the game. If already at night double the nighttime penalty. * Smokescreen (SS) - 4 hits, $400, 60 lb, 10 cf. Causes a 5 yard-radius smoke cloud when fired. Ammo costs $50, 20 lb, and has 9 shots per cf. Smoke dissipates in 10 seconds, whether or not a car drives close to it. * Spike Dropper (SD) - 3 hits, $750, 100 lb, 5 cf. Drops a 2 yard-radius cluster of spiked caltrops when fired. When a car goes over a cluster of these spikes, each wheel takes 1d-3 damage. Ammo costs $100, 20 lb, and has 10 seconds of ammo per cf.") "Choose Extra Equipment" (rule :name "Choose Extra Equipment" :summary "Listed here are several options that may be built into a Q-car design. More may be added to this list by the players if they wish, however all players present must agree on the addition. * Airfoils - Airdam in the front and/or a Spoiler in the back. +Handling Synergy. Destroyable. Costs 20% of final body cost and weighs 3% of final body weight each. * Active Suspension - $4000, 100 lb. A sophisticated electronic system controls the suspension to subtract .25 from the SR of a car. * Antilock Brakes - $1000, 10 lb. An advanced engineering system which prevents wheels from locking up when braking suddenly. +10 Dec, destroyable. * Brake Chute - A parachute mounted at the rear of the vehicle, designed to give rapid emergency deceleration. The vehicle must be travelling at least 60mph for the chute to deploy properly. 1-shot 60mph deceleration, minor option, destroyable. * Collision Spikes - $200, 30 lb. These nasty buggers pop out in the event of a collision with any object over 50 lb. One each may be mounted on the front, back, left or right sides. +Damage in a collision. * Convertible Top - Costs 50% of final body cost, weights 5% of final body weight, takes up 5% of internal space. When the convertible top is retracted, treat the top of the car as unarmored. May be made to resemble fabric. Cars with a convertible top may not mount a turret. * Electronic Traction Control - $1000, 10 lb, 1 cf. A small chip that keeps the tires from spinning, reducing the problems of extreme acceleration and helping with cornering. Subtracts .25 from SR. * Fake Weapon - $200, 25 lb, 1 cf. Scary when it pops out to shoot, but doesn't do anything else. May be of any type. * Fire Extinguisher - $450, 150 lb, 5 cf. Puts out a car fire on a roll of 1-6 on one die. May only be discharged four times before needing reloading. * Lights and Sirens - Police lights, sirens and a handy little searchlight. Minor option, destroyable. * Link - $100. Links two weapons together, so that they are aimed and fired together. Roll separate to-hit and damage rolls for each weapon. The weapons may not fire individually; all of them must fire until the link is removed between fights. * Overdrive - An extra-tall gear that adds 15% to a vehicle's final top speed when activated, however when activated, acceleration is halved. Costs 50% of final body cost. * Ramplate - This can take the form of spikes, blades or a reinforced plate. Costs 200% of final body cost, weighs 2 lb for every cf of body size. May only be mounted on the front. +Damage in a collision involving the front of a car and -Damage taken. * Roll Cage - A tubular steel framework designed to enclose the vehicle's passenger compartment and maintain its shape. While it's designed primarily to protect occupants in the event of the car rolling onto its roof, it also offers significant protection against side impacts. Halves damage caused by side impacts, minor option. * Search Light * Stripped - Excess weight has been removed from the vehicle in order to improve performance. The vehicle is still street legal, though just barely. +10mph top speed +10 Acc. * Stripped to the Bones - Everything, absolutely everything not involved in making the car go forward very fast has been removed or lightened, to the point where the vehicle is no longer street legal (lacking things like headlights, indicators etc). +20mph top speed +20 Acc. * Sun Roof - Allows one occupant to stand and fire hand weapons from the sun roof in a 360 degree arc. Firer doing so counts as &quot;exposed&quot; for the purposes of incoming fire. May not be fitted to Bikes. * Targeting Computer - $2000, 10 lb, 1 cf. Gives a particular crew member +1 to hit with any of the car's weapons. Limit one per crew member. An Artificial Intelligence (AI) targeting computer may be bought for $10,000, 50 lb, and 3 cf. This gives one crew member +2 to hit. * Turret - A turret is the only way to give a weapon a 360 degree arc of fire. ** Luggage turrets resemble a car-top carrier or suitcases strapped to the roof of a car. ** Hidden turrets retract completely within the car when they are not needed. A car may only mount one turret, and it can only be as big as the car's maximum weapon space. A turret is protected by the car's top armor. Turrets are built just like car bodies. For every cf of internal space a Luggage turret has, it takes up .2 cf, costs $50, and weighs 3 lb. For every cf of internal space a Hidden turret has, it takes up 1.2 cf, costs $100, and weighs 4 lb. For a weapon to be considered &quot;mounted&quot; in a turret, the entire weapon must fit into the turret's space. Ammunition does not have to be mounted in a turret with the weapon. * Wheel Guards - For each wheel protected wheel guards cost $7.5 and weigh 2.5 lb per point of armor. To protect it's left and right front wheels with 10 points of armor, a car would pay $150 and use 50 lb. The wheel guards must match the car's armor; if the car's armor is CA, FP or LR, then all wheel guards must be CA, FP or LR. The maximum points of armor per guard is equal to cf/10. Protects only from aimed shots, and only on a 1-7 on one die. Resemble solid wheel covers. * Wheelie Bar - Costs 10% of final body cost, weighs 5% of body weight, and takes up 2 cf of space. Adds 5 mph to maximum design acceleration. !Motorcycles * A cheap bike body is made from rough steel with crude weld points but is cheaper than the standard body. For every cf. of space a cheap bike body costs $10, weighs 4 lb yet has a maximum load of 28 lb. * A standard bike body consists of a basic unit-body construction of galvanized steel and steel alloys For every cf. of space a standard bike body costs $15, weighs 4 lb and has a maximum load of 29 lb. * An expensive bike body is an advanced design using high-tech alloys and reinforced fiberglass. For every cf. of space an expensive bike body costs $25, weighs 4 lb, and has a maximum load of 30 lb. * Sport option may be used, as can XLT option. Drivers and passengers only take up 6 cf, 175 lb. and 4 cf, 150 lb. respectively (no gunners allowed). Engines are smaller, lighter, and easier to build. For bikes the smallest possible engine is 10 hp (minimum of one hit). Cheap - $8, 3 lb, 0.14 cf. Normal - $20, 2.4 lb, 0.12 cf. High Output (HO) - $32, 1.8 lb, 0.10 cf. Super High Output (SHO) - $44, 1.4 lb, 0.08 cf. Exotic (EX) - $60, 1 lb, 0.06 cf. Motorcycles only have two wheels with (bike cf / 10) hits each, and may not have spares. Weapons may only be mounted on the front or back. No turrets or convertible tops are allowed, but all other accessories may be mounted, including wheel and suspension upgrades. Basic SR for bikes is 5, and all bikes have RWD. Bikes only have three armor facings: front, back, and under. The other sides are considered unarmored. Anytime a bike takes damage from the back, a roll of 1 or 2 on one die means the damage bypasses the rear armor. A bike adds +1 to all it's Table Two rolls (see below). Motorcycles are -3 to target. Passengers may fire a hand weapon in any direction. ** Cowling - A large aerodynamic cowling at the front. This both increases the bike's top speed, and offers protection to the rider from shots to the front. +10mph top speed, rider counts as Partially Exposed to shots from the front, minor option, destroyable.") "Finishing the Design" (rule :name "Finishing the Design" :summary "Here is where the final calculations are made concerning a vehicles performance and statistics. A vehicle's Design Top Speed is found by using the formula: Design Top Speed = ((engine hp x 3150) / car weight) + 30. The Fury has a design top speed of ((260 x 3150) / 4342) + 30 = 218.62 mph. Now don't get too excited, we are not done yet. Every car has an Acceleration (AC). The designer trades speed for acceleration by modifying the vehicle's transmission and engine layout before construction. A vehicle's Maximum Design Acceleration is calculated by using the following formula: Maximum Design Acceleration = 30 - (3 x SR) Be sure to round Maximum Design Acceleration down before recording it. The maximum design acceleration of the Fury is 30 - (3 x 3.75) = 18.75 or 18 mph/s. Again, don't get too excited. We want the car to be quick, but we don't want to lose too much of that top speed. So we decide to make the acceleration 7 mph/s. This may only give a real world 0-60 of 8.57 seconds, but in the game it gives a quarter mile time of under 16 seconds at 112 mph, which is not bad. No vehicle may have an AC of more than the maximum. Determine what the new vehicle's AC will be. The AC you choose will determine the final top speed (TS). A vehicle's TS may be determined by the following formula: Final Top Speed = Design Top Speed x (1 - ((AC x 5) / 100)) Once we have decided on an acceleration of 7, we can determine the final top speed. (7 x 5) = 35, divided by 100 = 0.35. (1 - 0.35) = 0.65... 218.62 x 0.65 = 142 mph. Plus 10% for a sport body puts that up to 156 mph. Not bad at all. Once the final TS is calculated, add the percentages for accessories and body style, if so equipped. Mileage at 65 mph (or top speed, if lower) is in miles per gallon and is equal to: Mileage = (9000 / (hp + (weight / 20)))"))))) "Land, Sea and Air Terrain" (chapter :name "Land, Sea and Air Terrain" :sectionmap (sectionmap "Terrain, Natural" (section :name "Terrain, Natural" :terrainmap (terrainmap "Broken Ground" (terrain :name "Broken Ground") :Burning (terrain :name "Burning") :Cave (terrain :name "Cave" :titles "Cavern") :Desert (terrain :name "Desert" :summary "* +2 [Terrain Penalty] * +1 [Fatigue]/Turn * +1 [Thirst]/Hour * [Heat Wave] * [Mirage]") :Ice (terrain :name "Ice") :Jungle (terrain :name "Jungle" :summary "* Flora - Native peoples are well versed in finding food from their jungle environment but for the inexperienced there are many poisonous or harmful plants. Vines and creepers should never be grasped and pulled by the naked hand as many have sharp thorns, or can spilt into extremely sharp fibres, which can cause deep lacerations. Bamboo can split to form sharp stakes when mature and any minor cut can be very serious due to the high risk of infection. Many people will have seen the classic film or TV scene where the hero cuts a vine and then drinks from it, despite this being common scene it is not a good source of drinking water, if such water is red, yellow or milky in colour it is not safe to drink. Large sections of bamboo can also contain safe drinking water, to test for it tap the section of stem with blade or hard object and listen for a change in tone or sloshing sound, such water is safe to drink. On the other hand many jungle plants are very well adapted to such a damp environment and finding suitable leaves to make a waterproof shelter is often an easy task. Many plant saps contain irritants or toxins, which can be absorbed through the skin, so skin contact with plant sap should be avoided. Fungus is a major source of infections as in the high humidity the human body can become the perfect growing environment for a variety of unpleasant fungal parasites. Care to keep the feet dry using the correct powder is very important if at all possible as fungal foot infections in the jungle can quickly slow a person and turn a healthy one into a casualty. * Fauna - Jungles team with life but the greatest threat comes not from large animals but from invertebrates and smaller poisonous reptiles. Large predators such as Jaguar, Anaconda, and crocodiles will rarely attack adult humans. Much more dangerous are the vast array of stinging and biting insects which can cause sickness or be carriers for disease such as malaria and yellow fever. If scratched mosquito bites can quickly become infected in such conditions draining morale and strength. Scorpions, poisonous spiders and even poisonous frogs inhabit some jungles so checking your foot ware for visitors before putting your feet into them in the morning is vital. In some areas soldier ants can be a problems so sleeping should be done in hammocks above the ground, this also offers some protection against snakes and other nocturnal visitors. Larger predators and scavengers can be attracted by waste food and bodily waste so camp hygiene is important. If your party is strong and well armed certain large jungle animals can provide large amounts of fresh meat but such creatures are not easy to hunt and kill, wild boar and pigs are powerful animals. Most snakes are edible, an Anaconda can feed a small village but the capture and killing of one is not an easy task. Due to the variety of parasites and climate conditions the consumption of animals that you may find already dead is to be strongly avoided. * Environmental Hazards - Jungles are extremely hot and humid places and such conditions can place an enormous strain on the body. Despite the humidity dehydration can be a real problem and although water can be plentiful, clean water may not be. The jungle has a reputation for quickly destroying the fitness levels of the inexperienced, through dehydration, malnutrition, disease and fatigue. River crossings can be extremely hazardous and the simple precaution of wearing a condom (for the male members of the party) can prevent some very nasty parasites entering the body. Psychologically the jungles constant wall of green and low light levels beneath the canopy can seriously affect motivation and the sounds of the nocturnal animals can also be disturbing for those unused to them. All this said many native peoples around the world have learned to adapt and even thrive in such conditions.") :Lava (terrain :name "Lava") "Open Water" (terrain :name "Open Water") :Plains (terrain :name "Plains") :Quicksand (terrain :name "Quicksand") :Sand (terrain :name "Sand") :Scrubland (terrain :name "Scrubland") :Steppeland (terrain :name "Steppeland") :Snow (terrain :name "Snow") :Swamp (terrain :name "Swamp" :summary "* Bog Fen Murk") :Whitewater (terrain :name "Whitewater"))))) :Maps (chapter :name "Maps" :sectionmap (sectionmap :Terrain (section :name "Terrain" :rulemap (rulemap :Cave (rule :name "Cave" :summary "[Hazard]: Cave in.") :Jungle (rule :name "Jungle" :summary "[Hazard]: Difficulty starts at 2 for a sparse, mostly safe jungle.") :Snow (rule :name "Snow" :summary "[Hazard]: Avalanche."))))))))
nx/tactics/books/land_sea_and_air / tacticsbook
Description:
Function Name:
  • tacticsbook
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func tacticsbook : base/book (book :name "Land, Sea and Air" :image "LandSeaAndAir.jpg" :chaptermap (chaptermap "Land, Sea and Air Overview" (chapter :name "Land, Sea and Air Overview" :sectionmap (sectionmap "Why Tactics:Land, Sea and Air?" (section :name "Why Tactics:Land, Sea and Air?"))) "Land Sea and Air Unit Types" (chapter :name "Land Sea and Air Unit Types" :sectionmap (sectionmap "Strategic Movement" (section :name "Strategic Movement"))) "Land Sea and Air Rules" (chapter :name "Land Sea and Air Rules" :sectionmap (sectionmap "Vehicle Construction" (section :name "Vehicle Construction" :rulemap (rulemap "Choose Vehicle Type" (rule :name "Choose Vehicle Type" :summary "* Cycle * Car * Truck * Bus/RV * Helicopter * Airplane * Boat * Submarine Trailers !Abilities 50% Cost, 200% Load, -1 Handling !Units * Sidecar - Mini * Light Trailer * Medium Trailer * Heavy Trailer * Semi Trailer Cycles !Bicycles * Tricycle * 3 Speed Bicycle * 10 Speed Bicycle * Racing Bicycle ** Weight: 40lb. Top Speed: 40mph. Cargo 1cf. Max load 30lb. Cost $400. * Rikshaw Cycle !Motorcycles * Mini Cycle * Scooter * Sport Cycle * Racing Cycle * Cruising Cycle * Chopper ** RWD, driver and passenger. Top Speed 150. 50 mpg. Cargo 1 cf. Max load 50 lb. Cost: $5,000. Weight: 300 lb. !Trikes !Options * Sidecar * Trailer * Saddlebags Cycles - Body 25% Weight, 25% Cost, 25% Load * Dirt Bike - Personal Body * Sport Cycle - Light Body, Sport * ATC - Medium Fiberglass Body * ATV - Heavy Fiberglass Body * Road Hog - Heavy Body Cars * Midget Racer - Personal, Stripped * Formula One - Mini, Sport, Stripped * Subcompact - Mini * Cooper - Mini, Sport * Compact - Light * Dune Buggy - Light, Offroad, Stripped * Trike - Light, Fiberglass * Sportscar - Light, Sport * Mid-Sized - Medium * Light SUV - Medium * Station Wagon - Extended * Luxury - Extened, Luxury * Limosine - Heavy, Luxury * Police Cruiser ** Very similar to a four-door mid-sized passenger sedan. Always RWD, with maybe 250 hp, driver, gunner, three prisoners (passengers). SR 4.75, TS 155, AC 9 (max 20), 19 mpg@65. No Armor. Cargo 20 cf. Max load 300 lb. $35,000, 3600 lb. Each police cruiser will have at least one shotgun. * Cars ** Subcompact Car *** FWD, two-door or four-door. Two to five passengers. Top Speed 100mph. 30mpg. Cargo 15 cf /225 lbs. $15,000, 2350 lb. ** Compact Car *** FWD with around 130 hp, two- or fourdoor. Four to five passengers. SR 5.25, TS 120, AC 6 (max 10), 27 mpg@65. No Armor. Cargo 20 cf. Max load 300 lb. $20,000, 2800 lb. ** Mid Sized Car *** FWD or RWD, with around 180 hp, two- or four-door with four to five passengers. SR 5.5, TS 130, AC 6 (max 11), 22 mpg@65. No Armor. Cargo 20 cf. Max load 300 lb. $26,000, 3300 lb. ** Station Wagon ** Luxury Car ** Mini Van") "Choose Frame" (rule :name "Choose Frame" :summary "* [Personal Frame] - Passengers can only be carried as cargo. * [Mini Frame] * [Light Frame] * [Medium Frame] * [Extended Frame] * [Heavy Frame] * [Extra Heavy Frame] * [Super Heavy Frame] * [Sport] * [Racing] * [Utility] * [Luxury] * [Heavy Duty] !Modifiers * Standard - the default for all cars is the standard body style. Up to 40% of their internal space may be devoted to weapons. * Stripped - 75% Weight, 75% Cost, No Armor. All exrtas like lights and air bags are removed. * Utility - 75% Cost, -1 Handling * Sport - 150% Cost, 120% Top Speed, +1 Handling, 75% Load * Racing - 300% Cost, 150% Top Speed, +2 Handling, 50% Load * Luxury - 150% Cost, +1 Handling ** Power everything, ABS, High quality Air bags, etc. * Heavy Duty - 150% Cost, 150% Load * Offroad - 150% Cost, -1 Terrain Penalty * Cheap car body - made from rough steel with crude weld points but is cheaper than the standard body. For every cf. of space a cheap car body costs $10, weighs 6 lb, yet has a maximum load of 28 lb. A car body made with cheap materials adds .25 to SR (see below). * Standard car body - consists of a basic unit-body construction of galvanized steel and steel alloys. For every cf. of space a standard car body costs $15, weighs 6 lb and has a maximum load of 29 lb. * Expensive car body - is an advanced design using high-tech alloys and reinforced plastics. For every cf. of space an expensive car body costs $25, weighs 6 lb, and has a maximum load of 30 lb. A car body made with cheap materials subtracts .25 from SR (see below). * Extra light (XLT) construction - adds 100% to the current body cost but reducing body weight by 25%. Cars with XLT bodies take 50% more damage in a collision. * Low Profile - cars that are low profile have been flattened so that their width and length are somewhat greater in proportion to their height. Many sports cars and limousines may be considered low profile. This makes them harder to hit and they handle better because of a lower center of gravity, but because they have less surface area they cannot mount as many weapons. -1 to hit, -0.5 SR. Only 25% of internal space may be used for weapons. * Very Low Profile - cars that are very low profile have been flattened so that their width and length are much greater in proportion to their height. Many exotic sports cars like the Lamborgini are very low profile. This is simply an extreme version of low profile. -2 to hit, -1 SR. Only 10% of internal space may be used for weapons. * High Profile - cars that are high profile are tall in proportion to their width and length. Many sport-utility vehicles and all vans may be considered high profile. +1 to hit, + .5 SR. Up to 75% of their internal space may be devoted to weapons. Space taken up by ammunition does not count against the amount of space a vehicle may use for weapons, only the weapons themselves counts against this. * Sport Model - Compacts or Mid-Sized only. The car is a &quot;sports&quot; car with only room for two, a driver and a single passenger. +30mph adds aerodynamic streamlining. A Sport body costs 100% more, subtracts .25 from SR, weighs 5% lighter, and adds 10% to final top speed and mileage. * The Utility option has one purpose: cheaper is better. Utility bodies are 30% cheaper, add .25 to SR, and subtract 15% from their final top speed and mileage. * The Sport Utility option adds aerodynamic streamlining to a heavier, cheaper frame. A Sport Utility body costs 60% more, adds 10% to final top speed and mileage, but adds .25 to SR.") "Choose Mass" (rule :name "Choose Mass") "Choose Engine(s)" (rule :name "Choose Engine(s)" :summary "** [[Unpowered]] ** [[Wood Burning Engine]] ** [[Coal Fired Engine]] - 35% Efficiency, 30 MJ/kg ** [[Battery Powered]] - 85% Efficiency ** [[Gasoline Engine]] - 20% Efficiency, 45.8 MJ/kg, .41 kW/kg Power / Weight ** [[Diesel Engine]] - 25% Efficiency, 45.3 MJ/kg (denser than Gasoline with 15% more energy by volume), .41 kW/kg Power / Weight (Turbocharged V8 Diesel) ** [[Natural Gas Engine]] ** [[Hydrogen Fuel Cell]] ** [[Jet Engine]] - 43.7 MJ/kg ** [[Rocket Engine]] - 70% Efficiency, 164 kW/kg Power / Weight (Space Shuttle) ** [[Nuclear Plant]] ** [[Fusion Plant]] * Cheap - $8, 5 lb, 0.2 cf. * Normal - $20, 4 lb, 0.18 cf. * High Output (HO) - $35, 3 lb, 0.15 cf. * Super High Output (SHO) - $50, 2.5 lb, 0.13 cf. * Exotic (EX) - $75, 2 lb, 0.11 cf. An engine has 1 hit per 2 full cubic feet. The smallest possible engine is 25 hp. A car may mount more than one engine, but may only use one at a time. * Turbocharger - This device uses the engine's exhaust stream to drive an air compressor which increases the engine's power output. It is not possible to fit a Supercharger and a Turbocharger into the same vehicle. +20mph, minor option.costs 50% of the original engine cost, weight is 10% of the original engine weight. A Turbocharger adds 30% to hp. No more than four turbochargers may be added to an engine. * Supercharger - A supercharger uses a belt and pulley mechanism linked to an engine's crankshaft to force extra air and fuel into the engine's combustion chambers, greatly increasing engine power. It is not possible to fit a Supercharger and a Turbocharger into the same vehicle. +20mph top speed +10 Acc. Costs 100% of the original engine cost, weight is 15% of the original engine weight. Adds 65% to total hp and one hit to the engine. May be combined with turbochargers, but if even one turbocharger is added the Supercharger only adds 40% to total hp. * Nitrous oxide may be purchased for $500, 15 lb. When fired (like a weapon), this system injects Nitrous Oxide gas into the combustion chamber. This gives a brief but enormous boost to speed. For a single turn per use, the vehicle's acceleration is increased by 30. This acceleration can be used to boost a vehicle's speed to over its normal Top Speed, but on the following turn it must reduce speed down to the Top Speed. 3-shot +30mph acceleration, minor option, destroyable More than one may be mounted but the effects of using two or more are not cumulative. * Computerised Engine Management - An electronic system which constantly monitors and tunes the engine as it is running, in order to maximise performance. +10 Acceleration, minor option, destroyable. * Engine Rebuild - Also known as &quot;blueprinting&quot;. The engine has been taken apart and re-assembled to within the most exacting tolerances, and certain production items replaced with high performance alternatives. +20mph top speed, minor option. * Fuel Injection - An advanced system which replaces the carburettor, giving a significant boost to performance. It is not possible to fit a Fuel Injection system and a Multicarb into the same vehicle. +20mph top speed +10mph Acc 2 minor options. * Multicarb - A multi-barrelled carburettor designed to give superior performance over the standard single barrelled carb. It is not possible to fit a Multicarb and a Fuel Injection system into the same vehicle. +20mph, minor option.") "Choose Travel Modes" (rule :name "Choose Travel Modes" :summary "** Land *** Wheeled *** Tracked *** Walker ** Marine *** Sail *** Prop *** Catamaran *** Hydrofoil *** Airboat - Steering is by rudders. No brakes or reverse. *** Hovercraft *** Submarine ** Ice *** Ice Sailboat *** Aerosan - Ice Airsled ** Air *** Propeller *** Jet *** Helicopter *** Rocket ** Space *** Rocket *** Magnetic Ion *** Hyperdrive *** Space Fold * Aquatic * Submersible * Glider * Propeller * Jet * Suborbital * Orbital * ExtraOrbital * Interplanetary - Can endure the rigors of interplanetary space for months if necessary. Completely self contained and recycling environment and food supply. * Interstellar - Can endure the rigors of interstellar space for years if necessary. Completely self contained and recycling environment and food supply. All cars have four wheels. Each wheel has (body space/20) hits, rounded down. Wheels may be reinforced to take more damage than they would normally be able to. This costs 35% of body cost and doubles the number of hits for each wheel. Wheels may be made fire-proof (FP) for an extra 10% of body cost. * High Preformance Tires - cost 40% of body cost, and subtract .25 from SR. Racing tires cost 100% of body cost, and subtract .5 from SR. * Racing Slicks - Racing style tires, with no noticeable tread pattern. Great for improving traction in dry conditions on the racetrack, lousy if it's wet, on a real road or off-road. +2HCon &quot;clean&quot; dry asphalt, -1HC on typical roads, -2HC off-road or on wet asphalt. * Spare tires count against the car's max weight and space. Each spare tire costs 20% of body cost, weights 5% of body weight, and takes up 1% of body space. A spare may be mounted on any side externally. This option costs an additional $100, but takes up no internal space. All external spares take damage BEFORE the armor they are mounted on, however if they take more than 3 hits of damage in a single round they fall off, effectively removed from game play. Spare tires may not have wheel guards. !Drivetrain * Rear wheel drive (RWD) is the standard drivetrain that comes with a vehicle design. * Front wheel drive (FWD) is a drivetrain option that reduces final body cost and weight by 15%. FWD adds .25 to SR. * All wheel drive (AWD) is a drivetrain option that increases final body cost by 100% and weight by 10%. +2HC on ice, oil, wet roads or offroad.") "Choose Maneuverability" (rule :name "Choose Maneuverability" :summary "* Human Interface - Physical skills in a vehicle are generally limited by how closely the vehicle matches the human body unless a particular piece of hardware is installed to enable the specific skill. ** Land *** Aerodynamics *** Suspension *** Terrain Modifications *** Traction ** Air *** VTOL *** Jumpjets *** Booster Rockets ** Space *** Verniers !Suspension * Sporty - For 50% of the final body cost a vehicle's suspension may be upgraded to Sporty. These better arms and shocks decrease SR by .25. * Sport - For 100% of the final body cost a vehicle's suspension may be upgraded to Sport. These superior coils, struts, and frame stiffening decrease SR by .5. * Racing - For 175% of the body cost the suspension may be upgraded to Racing, with complete body stiffening, automatic camber adjustment, and computer controlled shocks. Racing suspension decreases SR by one. * Off Road Suspension - Heavy duty suspension with a higher than usual ground clearance. Allows vehicle to pass Rough Terrain without penalty and to pass through Punishing Terrain. * Computer Assisted Suspension - An electronic system which monitors and adjusts the suspension in order to give a smoother, more stable ride. +1 HC minor option, destroyable.") "Choose Fuel and Range" (rule :name "Choose Fuel and Range" :summary "** External Fuel Tanks ** Propellant / Reaction Mass (spacecraft) * Gas Tank - $10 per gallon, weighs 7 lb (full) per gallon. Gas costs $2 a gallon. If a car runs out of gasoline (or a car's gasoline tank or engine is destroyed) the car may not accelerate and automatically decelerates by 5 mph per second. * Armored Gas Tank - $15 per gallon, weighs 12 lb (full) per gallon. * Self-sealing Gas Tank - $20 per gallon, weighs 10 lb (full) per gallon. Self-sealing gasoline tanks cannot explode when hit, but can explode when the vehicle is on fire. * Self-sealing Armored Gas Tank - $40 per gallon, weighs 15 lb (full) per gallon. Self-sealing armored gasoline tanks cannot explode.") "Choose Mission Specific" (rule :name "Choose Mission Specific" :summary "** Cargo Bay ** Decoys ** ECM/EW ** Hanger Bay ** Passenger Space - Passenger space is relative to the number of passengers, the operating range, and the relative luxury of the craft. ** Sensors ** Stealth ** Cloak !Cargo Cargo space is (usually) your leftover space: space not taken up by people, guns, or equipment. * Hidden Cargo Space - Up to half the cargo space in the vehicle is in hidden compartments. Handy in the event of &quot;Imperial Entanglements&quot;. Minor option, destroyable * Flatbed - Cargo space designated as a &quot;flatbed&quot; is exposed to the open air, but can carry twice the normal load. * Another vehicle may be put into cargo space, if the vehicle's Maximum Cargo Load is great enough. Any car placed in cargo of another car exits via the standard cargo access (usually the back), and suffers a Turn III in doing so.") "Choose Armor" (rule :name "Choose Armor" :summary "** Command Armor ** Radiation Shielding !Armor * Armor is applied to the six sides: Front, Left, Right, Back, Top, and Under. Armor for vehicles is spaced in layers of sheets 1/4&quot;-1&quot; apart and consists of a standard ablative carbon-reinforced plastic. This material is light and very strong, and can be shaped into any form, however it's ablative attribute has it's limitations. * Normal armor costs cubic feet divided by 10 and weighs (cubic feet divided by 30) + 5 per point. * Sloped (SLO) armor angles the plates under the skin of most of the vehicle, making it more efficient. Sloped armor costs cubic feet divided by 8 and weighs (cubic feet divided by 38) + 5 per point. * Chambered armor (CA) consists of tactically placed spacing between layers of high-quality sloped armor. This design costs cubic feet divided by 5 and weighs (cubic feet divided by 46) + 5 per point. * Options: Fireproof armor (FP) - Costs twice as much as regular armor but prevents the car from catching on fire, unless the armor becomes breached. * Laser Reflective (LR) Armor - Costs 3 times as much as normal armor but cuts all damage from lasers in half (unless the side hit is breached). * The combination of LR and FP armor (LRFP) costs 5 times as much as regular.") "Choose Weapons" (rule :name "Choose Weapons" :summary "!Aimed Weapons All aimed weapons come standard with a heavy transversal mounting, and an autoloader, allowing a high-degree arc of fire and an uninterrupted ammunition supply. This in turn makes them very versatile and powerful yet much bigger and heavier than normal. Aimed weapons can be mounted on the front, back, right, or left side of the car. Armed weapons may also be mounted in a turret on the top of the body. * Arcs of fire ** Hand Weapons *** The driver of a vehicle may fire directly ahead, or up to 90 degrees to the drivers side. *** The front passenger of a vehicle may fire in a 180 degree arc from directly ahead to directly behind. *** Rear passengers of a vehicle may fire directly behind, or up to 90 degrees to the side that they are on. *** Passengers standing up in a sunroof may fire in a 360 degree arc around the vehicle. *** Occupants in a convertible may fire in a 360 degree arc, except for the driver who is limited to the 180 degree forward arc. ** Mounted Weapons *** Door mounts fire into a 90 degree arc measured from the adjacent side or rear square. *** Pintle mounts fire into a 180 degree arc, either forward or rear. *** Fixed mount - directly ahead, and 1 square (50mm) either side of directly ahead (in effect a 3 square (150mm) wide fire corridor) *** 180 Turrets are must be specified as either Forward or Rear facing *** 360 degree mounts can fire in any direction. * Machine Guns The machine gun has been the mainstay of every army since the dawn of the 20th century. Light and cheap yet with a high rate of fire, they are very effective in high speed combat. The Gatlingstyle machine guns are a more recent design, and can devastate an opponent in seconds. ** Option: Super High Density (SHD) ammo - Cost x 10, +25% weight, +1/die damage. ** Machine Gun .223 (MG22) - To hit 11, 1d-4 damage, 1 hit. Cost $1200, weight 40 lb, 5 cf. Ammo costs $100, 80 lb, and has 100 seconds of ammo per cf. ** Machine Gun .30 (MG30) - To hit 11, 1d-2 damage, 2 hits. Cost $1950, weight 70 lb, 9 cf. Ammo costs $200, 50 lb, and has 50 seconds of ammo per cf. ** Machine Gun .50 (MG50) - To hit 11, 1d+2 damage, 4 hits. Cost $4200, weight 200 lb, 14 cf. Ammo costs $500, 50 lb, and has 20 seconds of ammo per cf. ** Chain Gun .50 (CG5) - To hit 12, 2d+1 damage, 4 hits. Cost $6000, weight 210 lb, 22 cf. Ammo costs $500, 50 lb, and has 12 seconds of ammo per cf. ** Automatic Shotgun ** 20 mm Autocannon (AC) - To hit 12, 5d+1 damage, 6 hits. Cost $28900, weight 850 lb, 60 cf. Ammo costs $250, 20 lb, and has 2 seconds of ammo per cf. Burst effect. * Cannons ** Option: Armor Piercing (AP) ammo - Cost x 3, +15% weight, +4/die damage. ** 20 mm Anti-Tank Gun (ATG) - To hit 11, 2d+4 damage, 4 hits. Cost $5500, weight 460 lb, 38 cf. Ammo costs $250, 20 lb, and has 10 shots per cf. Burst effect. ** 35 mm Cannon (C35) - To hit 11, 4d+10 damage, 7 hits. Cost $15600, weight 700 lb, 56 cf. Ammo costs $400, 20 lb, and has 6 shots per cf. Burst effect. ** 60 mm Cannon (C60) - To hit 11, 7d+15 damage, 7 hits. Cost $31100, weight 1320 lb, 75 cf. Ammo costs $750, 20 lb, and has 4 shots per cf. Burst effect. * Laser Weapons - Heavy and expensive yet extremely accurate and powerful, lasers offer a decisive advantage to their wielder. This advantage is balanced by the expensive laser-reflective armor available. ** Option: Infrared Modulation - Laser cost x 1.5, same weight, no penalty for firing through smoke. ** Light Laser (LL) - To hit 14, 1d-3 damage, 2 hits. Cost $5000, weight 125 lb, 10 cf. Has 30 shots from a rechargeable battery. ** Laser (L) - To hit 14, 2d-1 damage, 2 hits. Cost $10000, weight 350 lb, 25 cf. Has 30 shots from a rechargeable battery. ** Heavy Laser (HL) - To hit 14, 4d-1 damage, 3 hits. Cost $22000, weight 675 lb, 40 cf. Has 30 shots from a rechargeable battery. * Flame-Throwers - Used as anti-tank weapons and bunker busters for decades, these fire breathers are more efficient and longer range than their predecessors. ** Light Flame-Thrower (LFT) - To hit 13, 1d-1 damage, 2 hits. Cost $2500, weight 85 lb, 10 cf. Ammo costs $30, 40 lb, and has 4 seconds of ammo per cf. Limited to a 40 yard range. ** Flame-Thrower (FT) - To hit 13, 2d damage, 3 hits. Cost $4000, weight 150 lb, 20 cf. Ammo costs $30, 40 lb, and has 2 seconds of ammo per cf. Limited to a 60 yard range. ** Heavy Flame-Thrower (HFT) - To hit 13, 3d damage, 4 hits. Cost $7000, weight 300 lb, 35 cf. Ammo costs $30, 40 lb, and has one second of ammo per cf. Limited to a 80 yard range. * Grenade Launchers An automatic version of the popular infantry weapon. The gunner has the choice of attacking the target side of a vehicle or of attacking the top of the target at an additional -1 to hit. Used in this manner, the grenade launcher (other than the mortar, see below) is the only weapon that may fire OVER another car or obstacle, with no line-ofsight. ** Options: Incendiary - Cost $650 per cf of ammo. ** 40 mm Grenade Launcher (GL) - To hit 10, 2d damage, 3 hits. Cost $2850, weight 275 lb, 20 cf. Ammo costs $500, 45 lb, and has 30 shots of ammo per cf. Maximum range 100 yards. Burst effect. * Mortars - An infantry mainstay, somewhat inaccurate but extremely effective. Because of the general attempt of the gunner to place a mortar near the target, the gunner has the choice of attacking the target side of a vehicle or of attacking the top of the target at an additional -4 to hit. Similar to the 22 grenade launcher, the mortar may fire OVER another car or obstacle, with no line-of-sight. ** Options: White Phosphorus (WP) - Cost x2. ** 80mm Mortar - To hit 9, 6d damage, 4 hits. Cost $6500, weight 750 lb, 40 cf. Ammo costs $750, 50 lb, and has 12 shots of ammo per cf. Maximum range 300 yards. Burst effect. * Rockets - Powerful and cheap, rockets are some of the most effective weapons in the game. They also are rather inaccurate. After the first one, each additional rocket of the same size mounted on the same side takes up only 50% of its space and weighs 75% its weight. Rockets have a range of about 1000 yards. All rockets are burst effect weapons. ** Options: Pop-Up (PUR) - Minus 2 damage. Cost +70%. When a PUR hits the target car, the top side receives the damage. ** White Phosphorus (WP) - Cost +20%, -1 damage. ** Optical Target Recognition System (OTRS) - Cost +400%, -2 damage. To hit 9 within 100 yards, but locks on at 100 yards and has a to hit of 16 from there out, with no modifiers for range. ** 45 mm Rocket (R45) - To hit 9, 2d damage, 1 hit. Cost $470, weight 80 lb, 8 cf. Only 1 shot. ** 60 mm Rocket (R60) - To hit 9, 4d damage, 1 hit. Cost $950, weight 160 lb, 12 cf. Only 1 shot. ** 89 mm Rocket (R89) - To hit 9, 6d damage, 1 hit. Cost $2150, weight 240 lb, 16 cf. Only 1 shot. ** 120 mm Rocket (R120) - To hit 9, 8d damage, 1 hit. Cost $4500, weight 320 lb, 20 cf. Only 1 shot. ** Rocket Pod !Dropped Weapons Dropped weapons can only be mounted on the back or sides of a car. A dropped weapon mounted on the side of a car is to the left or right. Any number of dropped weapons may overlap, however, mines mixed with ACFO automatically go off (dealing mine damage to the firing car), but regular oil that comes into contact with ACFO does NOT ignite. * Mine Dropper (MD) - 2 hits, $1000, 50 lb, 15 cf. When a vehicle goes within the range of a mine (a 2 yard radius), each wheel takes 1d damage and the underbody takes 2d+6 damage. Each mine is $100, 20 lb, and .5 cf. Burst effect. ** Option: Claymore Mine (CM)- Costs $200 per cf., however when a claymore is dropped the direction of the blast must be specified. Claymores may be set to attack the bottom, left, right, front, or back of a vehicle. When a vehicle goes within range of a claymore the side specified takes 3d+2 damage. * Oil Jet (OJ) - 3 hits, $300, 20 lb, 5 cf. Causes a 5 yard-radius oil slick to fill the road when fired. Driving over oil is a Turn III. Ammo costs $30, 40 lb, and has 5 shots per cf. ** Option: Air-Contact Flaming Oil (ACFO) - Costs $1000 per cf, same as regular oil, but for every second a car is on the flaming slick it must roll as per a flame weapon on each tire and the underbody. ACFO burns out in 20 seconds. * Paint Sprayer (PS) - 2 hits, $500, 75 lb, 10 cf. Causes a 5 yard-radius paint cloud when fired. Ammo costs $100, 30 lb, and has 8 shots per cf. Paint dissipates in 3 seconds. Normal smoke penalty to 23 shoot through and if a car touches it treat that car as if it was night for the rest of the game. If already at night double the nighttime penalty. * Smokescreen (SS) - 4 hits, $400, 60 lb, 10 cf. Causes a 5 yard-radius smoke cloud when fired. Ammo costs $50, 20 lb, and has 9 shots per cf. Smoke dissipates in 10 seconds, whether or not a car drives close to it. * Spike Dropper (SD) - 3 hits, $750, 100 lb, 5 cf. Drops a 2 yard-radius cluster of spiked caltrops when fired. When a car goes over a cluster of these spikes, each wheel takes 1d-3 damage. Ammo costs $100, 20 lb, and has 10 seconds of ammo per cf.") "Choose Extra Equipment" (rule :name "Choose Extra Equipment" :summary "Listed here are several options that may be built into a Q-car design. More may be added to this list by the players if they wish, however all players present must agree on the addition. * Airfoils - Airdam in the front and/or a Spoiler in the back. +Handling Synergy. Destroyable. Costs 20% of final body cost and weighs 3% of final body weight each. * Active Suspension - $4000, 100 lb. A sophisticated electronic system controls the suspension to subtract .25 from the SR of a car. * Antilock Brakes - $1000, 10 lb. An advanced engineering system which prevents wheels from locking up when braking suddenly. +10 Dec, destroyable. * Brake Chute - A parachute mounted at the rear of the vehicle, designed to give rapid emergency deceleration. The vehicle must be travelling at least 60mph for the chute to deploy properly. 1-shot 60mph deceleration, minor option, destroyable. * Collision Spikes - $200, 30 lb. These nasty buggers pop out in the event of a collision with any object over 50 lb. One each may be mounted on the front, back, left or right sides. +Damage in a collision. * Convertible Top - Costs 50% of final body cost, weights 5% of final body weight, takes up 5% of internal space. When the convertible top is retracted, treat the top of the car as unarmored. May be made to resemble fabric. Cars with a convertible top may not mount a turret. * Electronic Traction Control - $1000, 10 lb, 1 cf. A small chip that keeps the tires from spinning, reducing the problems of extreme acceleration and helping with cornering. Subtracts .25 from SR. * Fake Weapon - $200, 25 lb, 1 cf. Scary when it pops out to shoot, but doesn't do anything else. May be of any type. * Fire Extinguisher - $450, 150 lb, 5 cf. Puts out a car fire on a roll of 1-6 on one die. May only be discharged four times before needing reloading. * Lights and Sirens - Police lights, sirens and a handy little searchlight. Minor option, destroyable. * Link - $100. Links two weapons together, so that they are aimed and fired together. Roll separate to-hit and damage rolls for each weapon. The weapons may not fire individually; all of them must fire until the link is removed between fights. * Overdrive - An extra-tall gear that adds 15% to a vehicle's final top speed when activated, however when activated, acceleration is halved. Costs 50% of final body cost. * Ramplate - This can take the form of spikes, blades or a reinforced plate. Costs 200% of final body cost, weighs 2 lb for every cf of body size. May only be mounted on the front. +Damage in a collision involving the front of a car and -Damage taken. * Roll Cage - A tubular steel framework designed to enclose the vehicle's passenger compartment and maintain its shape. While it's designed primarily to protect occupants in the event of the car rolling onto its roof, it also offers significant protection against side impacts. Halves damage caused by side impacts, minor option. * Search Light * Stripped - Excess weight has been removed from the vehicle in order to improve performance. The vehicle is still street legal, though just barely. +10mph top speed +10 Acc. * Stripped to the Bones - Everything, absolutely everything not involved in making the car go forward very fast has been removed or lightened, to the point where the vehicle is no longer street legal (lacking things like headlights, indicators etc). +20mph top speed +20 Acc. * Sun Roof - Allows one occupant to stand and fire hand weapons from the sun roof in a 360 degree arc. Firer doing so counts as &quot;exposed&quot; for the purposes of incoming fire. May not be fitted to Bikes. * Targeting Computer - $2000, 10 lb, 1 cf. Gives a particular crew member +1 to hit with any of the car's weapons. Limit one per crew member. An Artificial Intelligence (AI) targeting computer may be bought for $10,000, 50 lb, and 3 cf. This gives one crew member +2 to hit. * Turret - A turret is the only way to give a weapon a 360 degree arc of fire. ** Luggage turrets resemble a car-top carrier or suitcases strapped to the roof of a car. ** Hidden turrets retract completely within the car when they are not needed. A car may only mount one turret, and it can only be as big as the car's maximum weapon space. A turret is protected by the car's top armor. Turrets are built just like car bodies. For every cf of internal space a Luggage turret has, it takes up .2 cf, costs $50, and weighs 3 lb. For every cf of internal space a Hidden turret has, it takes up 1.2 cf, costs $100, and weighs 4 lb. For a weapon to be considered &quot;mounted&quot; in a turret, the entire weapon must fit into the turret's space. Ammunition does not have to be mounted in a turret with the weapon. * Wheel Guards - For each wheel protected wheel guards cost $7.5 and weigh 2.5 lb per point of armor. To protect it's left and right front wheels with 10 points of armor, a car would pay $150 and use 50 lb. The wheel guards must match the car's armor; if the car's armor is CA, FP or LR, then all wheel guards must be CA, FP or LR. The maximum points of armor per guard is equal to cf/10. Protects only from aimed shots, and only on a 1-7 on one die. Resemble solid wheel covers. * Wheelie Bar - Costs 10% of final body cost, weighs 5% of body weight, and takes up 2 cf of space. Adds 5 mph to maximum design acceleration. !Motorcycles * A cheap bike body is made from rough steel with crude weld points but is cheaper than the standard body. For every cf. of space a cheap bike body costs $10, weighs 4 lb yet has a maximum load of 28 lb. * A standard bike body consists of a basic unit-body construction of galvanized steel and steel alloys For every cf. of space a standard bike body costs $15, weighs 4 lb and has a maximum load of 29 lb. * An expensive bike body is an advanced design using high-tech alloys and reinforced fiberglass. For every cf. of space an expensive bike body costs $25, weighs 4 lb, and has a maximum load of 30 lb. * Sport option may be used, as can XLT option. Drivers and passengers only take up 6 cf, 175 lb. and 4 cf, 150 lb. respectively (no gunners allowed). Engines are smaller, lighter, and easier to build. For bikes the smallest possible engine is 10 hp (minimum of one hit). Cheap - $8, 3 lb, 0.14 cf. Normal - $20, 2.4 lb, 0.12 cf. High Output (HO) - $32, 1.8 lb, 0.10 cf. Super High Output (SHO) - $44, 1.4 lb, 0.08 cf. Exotic (EX) - $60, 1 lb, 0.06 cf. Motorcycles only have two wheels with (bike cf / 10) hits each, and may not have spares. Weapons may only be mounted on the front or back. No turrets or convertible tops are allowed, but all other accessories may be mounted, including wheel and suspension upgrades. Basic SR for bikes is 5, and all bikes have RWD. Bikes only have three armor facings: front, back, and under. The other sides are considered unarmored. Anytime a bike takes damage from the back, a roll of 1 or 2 on one die means the damage bypasses the rear armor. A bike adds +1 to all it's Table Two rolls (see below). Motorcycles are -3 to target. Passengers may fire a hand weapon in any direction. ** Cowling - A large aerodynamic cowling at the front. This both increases the bike's top speed, and offers protection to the rider from shots to the front. +10mph top speed, rider counts as Partially Exposed to shots from the front, minor option, destroyable.") "Finishing the Design" (rule :name "Finishing the Design" :summary "Here is where the final calculations are made concerning a vehicles performance and statistics. A vehicle's Design Top Speed is found by using the formula: Design Top Speed = ((engine hp x 3150) / car weight) + 30. The Fury has a design top speed of ((260 x 3150) / 4342) + 30 = 218.62 mph. Now don't get too excited, we are not done yet. Every car has an Acceleration (AC). The designer trades speed for acceleration by modifying the vehicle's transmission and engine layout before construction. A vehicle's Maximum Design Acceleration is calculated by using the following formula: Maximum Design Acceleration = 30 - (3 x SR) Be sure to round Maximum Design Acceleration down before recording it. The maximum design acceleration of the Fury is 30 - (3 x 3.75) = 18.75 or 18 mph/s. Again, don't get too excited. We want the car to be quick, but we don't want to lose too much of that top speed. So we decide to make the acceleration 7 mph/s. This may only give a real world 0-60 of 8.57 seconds, but in the game it gives a quarter mile time of under 16 seconds at 112 mph, which is not bad. No vehicle may have an AC of more than the maximum. Determine what the new vehicle's AC will be. The AC you choose will determine the final top speed (TS). A vehicle's TS may be determined by the following formula: Final Top Speed = Design Top Speed x (1 - ((AC x 5) / 100)) Once we have decided on an acceleration of 7, we can determine the final top speed. (7 x 5) = 35, divided by 100 = 0.35. (1 - 0.35) = 0.65... 218.62 x 0.65 = 142 mph. Plus 10% for a sport body puts that up to 156 mph. Not bad at all. Once the final TS is calculated, add the percentages for accessories and body style, if so equipped. Mileage at 65 mph (or top speed, if lower) is in miles per gallon and is equal to: Mileage = (9000 / (hp + (weight / 20)))"))))) "Land, Sea and Air Terrain" (chapter :name "Land, Sea and Air Terrain" :sectionmap (sectionmap "Terrain, Natural" (section :name "Terrain, Natural" :terrainmap (terrainmap "Broken Ground" (terrain :name "Broken Ground") :Burning (terrain :name "Burning") :Cave (terrain :name "Cave" :titles "Cavern") :Desert (terrain :name "Desert" :summary "* +2 [Terrain Penalty] * +1 [Fatigue]/Turn * +1 [Thirst]/Hour * [Heat Wave] * [Mirage]") :Ice (terrain :name "Ice") :Jungle (terrain :name "Jungle" :summary "* Flora - Native peoples are well versed in finding food from their jungle environment but for the inexperienced there are many poisonous or harmful plants. Vines and creepers should never be grasped and pulled by the naked hand as many have sharp thorns, or can spilt into extremely sharp fibres, which can cause deep lacerations. Bamboo can split to form sharp stakes when mature and any minor cut can be very serious due to the high risk of infection. Many people will have seen the classic film or TV scene where the hero cuts a vine and then drinks from it, despite this being common scene it is not a good source of drinking water, if such water is red, yellow or milky in colour it is not safe to drink. Large sections of bamboo can also contain safe drinking water, to test for it tap the section of stem with blade or hard object and listen for a change in tone or sloshing sound, such water is safe to drink. On the other hand many jungle plants are very well adapted to such a damp environment and finding suitable leaves to make a waterproof shelter is often an easy task. Many plant saps contain irritants or toxins, which can be absorbed through the skin, so skin contact with plant sap should be avoided. Fungus is a major source of infections as in the high humidity the human body can become the perfect growing environment for a variety of unpleasant fungal parasites. Care to keep the feet dry using the correct powder is very important if at all possible as fungal foot infections in the jungle can quickly slow a person and turn a healthy one into a casualty. * Fauna - Jungles team with life but the greatest threat comes not from large animals but from invertebrates and smaller poisonous reptiles. Large predators such as Jaguar, Anaconda, and crocodiles will rarely attack adult humans. Much more dangerous are the vast array of stinging and biting insects which can cause sickness or be carriers for disease such as malaria and yellow fever. If scratched mosquito bites can quickly become infected in such conditions draining morale and strength. Scorpions, poisonous spiders and even poisonous frogs inhabit some jungles so checking your foot ware for visitors before putting your feet into them in the morning is vital. In some areas soldier ants can be a problems so sleeping should be done in hammocks above the ground, this also offers some protection against snakes and other nocturnal visitors. Larger predators and scavengers can be attracted by waste food and bodily waste so camp hygiene is important. If your party is strong and well armed certain large jungle animals can provide large amounts of fresh meat but such creatures are not easy to hunt and kill, wild boar and pigs are powerful animals. Most snakes are edible, an Anaconda can feed a small village but the capture and killing of one is not an easy task. Due to the variety of parasites and climate conditions the consumption of animals that you may find already dead is to be strongly avoided. * Environmental Hazards - Jungles are extremely hot and humid places and such conditions can place an enormous strain on the body. Despite the humidity dehydration can be a real problem and although water can be plentiful, clean water may not be. The jungle has a reputation for quickly destroying the fitness levels of the inexperienced, through dehydration, malnutrition, disease and fatigue. River crossings can be extremely hazardous and the simple precaution of wearing a condom (for the male members of the party) can prevent some very nasty parasites entering the body. Psychologically the jungles constant wall of green and low light levels beneath the canopy can seriously affect motivation and the sounds of the nocturnal animals can also be disturbing for those unused to them. All this said many native peoples around the world have learned to adapt and even thrive in such conditions.") :Lava (terrain :name "Lava") "Open Water" (terrain :name "Open Water") :Plains (terrain :name "Plains") :Quicksand (terrain :name "Quicksand") :Sand (terrain :name "Sand") :Scrubland (terrain :name "Scrubland") :Steppeland (terrain :name "Steppeland") :Snow (terrain :name "Snow") :Swamp (terrain :name "Swamp" :summary "* Bog Fen Murk") :Whitewater (terrain :name "Whitewater"))))) :Maps (chapter :name "Maps" :sectionmap (sectionmap :Terrain (section :name "Terrain" :rulemap (rulemap :Cave (rule :name "Cave" :summary "[Hazard]: Cave in.") :Jungle (rule :name "Jungle" :summary "[Hazard]: Difficulty starts at 2 for a sparse, mostly safe jungle.") :Snow (rule :name "Snow" :summary "[Hazard]: Avalanche."))))))))
nx/tactics/books/magic
Description:
Package Name:
  • nx/tactics/books/magic
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
Functions:
  • tacticsbook
Source Code:
  • (package nx/tactics/books/magic :libs (lib base :path nx/tactics/base)) (func tacticsbook : base/book (book :name "Magic" :image "Magick.jpg" :chaptermap (chaptermap "Magic Overview" (chapter :name "Magic Overview" :summary "* The Art Classifications * Abjuration - Protective Magic. They create barriers, negate abilities, harm trespassers, or banish those who do not belong. It includes Barriers and Wards.") "Magical Skills" (chapter :name "Magical Skills" :sectionmap (sectionmap :Spiritualism (section :name "Spiritualism" :powermap (powermap :Divination (power :name "Divination" :reference "* Casting: In various methods of divination, stones, cards, sticks and other objects are cast onto the ground or a special cloth so that an insight into the life patterns can be revealed. * Querent: In divination and ritual, the querent is the asker of questions. * Scrying: This is the area of divining by gazing into a reflecting surface." :summary "* Divination is the practice of discovering the unknown. It can foresee the future, find hidden things, uncover lost lore, and reveal deception. * Practitioners may see the many roads to the future and may choose the path that favors themselves and hinders their foes. * Fortune telling is more interested in predicting future events. Rather, divination tends to be more about discovering information. * It is an accepted truism within magick that divination is imperfect." :titles "Augur, Diviner, Fortune Teller, Oracle, Prophet, Seer, Soothsayer, Visionary" :abilitymap (abilitymap "All Seeing Eye" (ability :name "All Seeing Eye" :reference "The Eye of Providence") :Augury (ability :name "Augury") :Cartomancy (ability :name "Cartomancy" :summary "* The art of reading the future through playing cards or tarot cards.") :Clairaudience (ability :name "Clairaudience") :Clairvoyance (ability :name "Clairvoyance") :Dowsing (ability :name "Dowsing" :summary "* Through the use of a divining rod the user may detect desired items hidden underground below them.") "Fortune Telling" (ability :name "Fortune Telling" :summary "* [Deploy]: Roll vs. target Spirit. If you succeed, you receive +1 on all actions against him this encounter. * Casting - In various methods of divination, bones, stones, cards, sticks and other objects are cast onto the ground or a special cloth so that an insight into the life patterns can be revealed. * Bibliomancy - Reading random passages from a book, such as Liber Legis or the I Ching. * Tea Leaves * Tarot") :Hallmark (ability :name "Hallmark" :summary "* Analyze a magical effect to learn information about its caster.") :Kismet (ability :name "Kismet") "Mirror of Truth" (ability :name "Mirror of Truth" :summary "* Enchant a reflective surface to show the true nature of the reflected scene. This reveals illusions, hidden things, and can even reveal the nature of those concealing terrible secrets.") :Portent (ability :name "Portent" :summary "* Determine if a chosen course of action will tend to be beneficial to the user or not. How it might be beneficial is not known." :titles "Omen") :Postcognition (ability :name "Postcognition") :Precognition (ability :name "Precognition") :Prediction (ability :name "Prediction") :Premonition (ability :name "Premonition") :Prophesy (ability :name "Prophesy") :Providence (ability :name "Providence" :summary "* [Action]: Divine a time and place nearby that will be beneficial if the user goes there. The roll result is not known by the user, and the success determines the benefit.") :Revelation (ability :name "Revelation") :Foresight (ability :name "Foresight" :summary "* Foresight is a passive form of extra-sensory perception whereby a person spontaneously perceives information, in the form of vision, about future events before they happen. It is distinguished from [Precognition] in that it is passive.") "Twist of Fate" (ability :name "Twist of Fate") :Visions (ability :name "Visions") :Wyrding (ability :name "Wyrding")) :specialtymap (specialtymap :Hepatomancy (specialty :name "Hepatomancy" :summary "* The art of divining the future through the examination of a creature's entrails.") :Numerology (specialty :name "Numerology" :summary "* The art of divining the future through the examination of numbers and dates.") :Osteomancy (specialty :name "Osteomancy" :summary "* The art of divining the future through decaying bones.") "Rune Casting" (specialty :name "Rune Casting" :summary "* The art of divining the future through the throwing of small tiles with runes on them.") :Scrying (specialty :name "Scrying" :summary "* This is the art of divining by gazing into a reflecting surface.") :Tasseomancy (specialty :name "Tasseomancy" :summary "* Reading the patterns of tea leaves or coffee grounds left after the person drink it."))) :Dreaming (power :name "Dreaming" :reference "* I don't believe it. That is why you fail. Luke and Yoda - Empire Strikes Back" :summary "* This is the magical art of the [Fae]. * Every child has a sense of wonder that comes with being new to the world. Adults must, of necessity, murder that special innocence in order to grow up. * When humanity turned its collective back on Dreaming, a terrible scourge of disbelief and negation smote the world. Hope, trust, and imagination were replaced with reason, pessimism, and scrutiny. By dismissing hope and faith, humanity avoids being hurt by its failure. Shutting out mystery and dreams anesthetizes fear, but deadens beauty as well and leads to apathy, callosuness, and close-mindedness. Though Banality is a mindless force, it is feared by the [Fae] more than any monster or villain. It is an enemy unlike anything the [Fae] have ever encountered, and they are largely helpless in its grasp. * Dreaming is never the same, so any Dreaming effect must be a uniquely crafted idea or it will automatically fail." :titles "Glamour" :abilitymap (abilitymap "As if in a Dream" (ability :name "As if in a Dream" :summary "* Confuse a target's senses to perceive a single thing incorrectly.") "Concoct Dream Essence" (ability :name "Concoct Dream Essence" :summary "* Dreams caught with [Dreamcatching] can be contained in a bottle called [Dream Essence]. Opening the bottle releases the experience of the dream to all surrounding it.") "Create Chimera" (ability :name "Create Chimera" :summary "A Chimera is an imaginary creation. It exists only to the user, though those with magical abilities, young children and the mentally impaired may see them. They only can affect those who can see them.") "Down the Rabbit Hole" (ability :name "Down the Rabbit Hole" :summary "* [Requires]: A hole that leads somewhere unknown. * [Action]: By entering a hole, the Dreamer may travel to the [Spirit Realm]. If the Dreamer is a native of the [Spirit Realm], he may stay as long as he wants. If not, he will return to the real world after [Skill] hours as if waking from a dream.") :Dreamcatching (ability :name "Dreamcatching") :Dreamquest (ability :name "Dreamquest" :summary "* [Requires]: Sleeping * [Action]: While asleep, Spirit enters the [Spirit Realm]. The Spirit may travel as long as it wants, but whenever the Body awakens, the Spirit immediately returns. * [Death]: Spirit may permanently enter the [Spirit Realm].") "Dream Effectively" (ability :name "Dream Effectively" :reference "* I was just thinking. Wouldn't it be funny if I wasn't the only one who could dream effectively? What if everybody could do it? And reality was being pulled out from under us all the time - and we didn't even know it? - George Orr, The Lathe of Heaven * Oh, my God... I just killed six billion people... - George Orr, The Lathe of Heaven") "Dream Riding" (ability :name "Dream Riding" :summary "* Ability to enter another person's dream.") "Dream Sight" (ability :name "Dream Sight") "Dream Speak" (ability :name "Dream Speak" :summary "* Grants the ability to converse with things that cannot normally speak including plants, animals, and inanimate objects. Such beings have knowledge and personalities limited by their natures.") "Dream Weaving" (ability :name "Dream Weaving" :reference "* She was shaping a world. She could envision the world, feel the spring of the earth beneath her bare feet, the warmth of the sun, the vibrant green of the grass, the hazy blue of distant mountains. 'Do you feel it?' 'Yes.' 'Then make it real.' She brought all of her will to paint all the details of the dream onto a new reality. She opened her eyes and gazed out upon the land she had already seen in her mind. It was so beautiful it took her breath away ... and failed to return it. She gasped as her lungs emptied and her vision faded to black ... 'A useful lesson. You forgot to breathe in the scents of your world that would indicate air. Remember even the smallest detail is crucial.' - Tales of Magick") :Epiphany (ability :name "Epiphany" :summary "* A moment of ecstasy, delight, and intense revelation. During epiphanies, disparate things suddenly synchronize and make sense. Ephipanies often trigger major changes in personality or goals.") "Eyes of a Child" (ability :name "Eyes of a Child" :summary "* All Chimera become visible to those you chose.") "Fond Memories" (ability :name "Fond Memories" :reference "Eternal Sunshine of the Spotless Mind" :summary "* This ability makes every childhood dream and ambition real again. Every imaginary friend is remembered clearly and the happiest moments from youth return with the intensity of a first kiss and the excitement of Christmas. Then, suddenly, its over. In their absence, depression can crash down. Truly fallen beings can become suicidal. The remembrance can be uplifting in the end, allowing one to relive the best moments of life.") "Imaginary Friend" (ability :name "Imaginary Friend" :reference "* As I was walking up the stair, I met a man who wasn't there. He wasn't there again today. If only he would go away. - Children's Nursery Rhyme * Mother, do you remember when I was little, I had a friend, he was make-believe? No. Don't you remember? Only I could see him? No, I don't remember Drop Dead Fred at all. - Drop Dead Fred * Let's write something on the carpet... I know how about 'Mother SUCKS'. - Drop Dead Fred" :summary "Create a character with a distinct personality of your choice that only the target can see.") "Living Nightmare" (ability :name "Living Nightmare" :summary "* A chimerical monster formed from nightmares or madness." :titles "Waking Nightmare") "Nightmare Essence" (ability :name "Nightmare Essence" :summary "* Nightmares caught with [Dreamcatching] can be contained in a bottle. Opening the bottle releases the experience of the dream to all surrounding it. These can be used as grenades.") "Pillow Fort" (ability :name "Pillow Fort" :summary "* By exercising one's imagination, a soft barrier can provide real defense but only for the Dreamer. * [Action]: Any material may be chosen to provide [Skill] defense for the user.") :Rapture (ability :name "Rapture" :summary "* An extremely difficult and rare ability of self-discovery to create Glamour from oneself. Only at a moment of sudden self-realization can a Rapture be attained. * [Passive] - While in a Rapture, all [Critical] results generate [Glamour Token]s.") :Ravaging (ability :name "Ravaging" :summary "* Drain creativity from a subject. The subject must be well known and a good knowledge of how the subject dreams is required. After that, the subject must simply be touched and he/she will experience a wave of depression and fear as the Glamour is drained from them. * [Action]: Touch the subject. Roll [Banality]. Gain +1 [Glamour Token] if any successes. If no [Glamour] is gained, both the user and subject gain +1 [Banality] instead.") :Reverie (ability :name "Reverie" :summary "* Say or suggest things that inspire others to wonderful ideas and creations. This is a time-consuming process to discover they subtle things that inspire another to great works. * [Extended Action]: Inspire someone while they create. * [Action]: View a work of art created during Reverie. Gain +1 [Glamour Token]. A particular work of art may only grant this bonus once a year." :titles "Muse") :Seeming (ability :name "Seeming" :summary "* Take on the appearance of another.") "Shattered Dreams" (ability :name "Shattered Dreams") "Wall of Wonders" (ability :name "Wall of Wonders" :summary "* A wall of dreams. Causes [Fascination] in those who view it."))) :Enchantment (power :name "Enchantment" :summary "* Enchantment/Witchcraft focuses on enchantments that alter the fate of the target. * The deities of Witchcraft are embodiments of a life-force manifest in nature. The Goddess and God are seen as complementary polarities and this balance is seen in nature. They are sometimes symbolised as the Sun and Moon, and from her lunar associations the Goddess becomes a Triple Goddess with aspects of Maiden, Mother, and Crone. Some hold the Goddess to be pre-eminent, since she contains and conceives all. The God is the spark of life and inspiration within her, simultaneously her lover and her child." :titles "Abjuration, Beguiler, Enchanter, Enchantress, Entrancer, Hexer, Warlock, Witch, Witchcraft, Witchdoctor" :abilitymap (abilitymap "Barren Loins" (ability :name "Barren Loins" :summary "* Target cannot conceive a child while under this curse.") :Charm (ability :name "Charm" :summary "* The opposite of [Malediction]. Charm reduces the severity of negative effects. * [Requires]: Target cannot have any [Charm] Tokens. * [Action]: Roll vs. Spirit and add a Black [Charm] Token for each [Hit]." :titles "Warding Sign") "Death Ward" (ability :name "Death Ward" :summary "* Provides increased defense against undead beings.") "Evil Eye" (ability :name "Evil Eye" :summary "* Reduces Spirit") "Fertile Loins" (ability :name "Fertile Loins" :summary "* Next intercourse will have doubled chance to conceive a child, if possible.") :Haste (ability :name "Haste" :summary "* [Effect]: +1 Move * [Target]: [Area] * [Duration]: [Hits]") "Inscribe Rune" (ability :name "Inscribe Rune" :summary "* Allows the permanent addition of magical properties to an item.") "Inscribe Symbol" (ability :name "Inscribe Symbol" :summary "* Allows the temporary addition of magical properties to an item, portal, or area.") :Malediction (ability :name "Malediction" :summary "* The opposite of [Charm]. Malediction increases the severity of negative effects. * [Action]: Roll vs. Spirit and add a Black [Curse] Token for each [Hit].") "Magic Ward" (ability :name "Magic Ward" :summary "* Provides increased defense against magical creatures.") "Mental Ward" (ability :name "Mental Ward" :summary "* Provides increased defense against mental attacks.") "Metal Ward" (ability :name "Metal Ward" :summary "* Provides increased defense against predominately metal weapons.") "Nature Ward" (ability :name "Nature Ward" :summary "* Provides increased defense against Animals, and weather.") :Palsy (ability :name "Palsy" :summary "* Reduces Move") :Pox (ability :name "Pox" :summary "* Reduces Social Skills") "Rule of Three" (ability :name "Rule of Three" :reference "* Ever mind the Rule of Three, three times what thou givest returns to thee, this lesson well, thou must learn, thee only gets what thou dost earn." :summary "* Whatever energy a person puts out into the world, be it positive or negative, will be returned to that person three times.") :Safekeep (ability :name "Safekeep" :summary "* [Action]: Enchant an item to prevent loss or theft. Any effect that would remove, loose, or damage the item must roll vs. Safekeep or fail in addition to any other checks.") :Slow (ability :name "Slow" :summary "* [Effect]: -1 Move * [Target]: [Area] * [Duration]: [Hits]") "Spirit Ward" (ability :name "Spirit Ward" :summary "* Provides increased defense against spirit beings and attack against [Spirit].") "Stone Ward" (ability :name "Stone Ward" :summary "* Provides increased defense against predominately stone weapons.") :Weaken (ability :name "Weaken" :summary "* Reduces Body") "Wood Ward" (ability :name "Wood Ward" :summary "* Provides increased defense against predominately wooden weapons."))) :Shamanism (power :name "Shamanism" :titles "Shaman, Spirit Caller, Witch Doctor" :abilitymap (abilitymap "Call Spirits" (ability :name "Call Spirits") "Control Spirit" (ability :name "Control Spirit") :Reincarnate (ability :name "Reincarnate" :summary "* Similar to [Resurrect], this ability allows a being to return to life in a new body if this ritual is performed soon after death. The reincarnated being will be physically different from the original, potentially different age, abilities, gender, race, or species. The being will have most of its original memories, but will often have a substantially different personality. If any [Successes] are made, the reincarnation succeeds and the character must be created again with significant differences and will appear in a location consistent with its new identity. The new character is built at a level equal to it original level or the reincarnate skill level whichever is lower. If the reincarnate skill level is lower than 10, the reincarnated being will be -10% younger than before for each level below 10.") "Second Sight" (ability :name "Second Sight" :reference "* I've got electric light, and I've got second sight. I've got amazing...powers...of observation. And that is how I know...When I try to get through...On the telephone to you...There will be nobody home. - Pink Floyd, Nobody Home" :summary "* Second sight is the ability to see the spiritual essence of beings. It quickly identifies the living from the unliving and can detect disease both phyiscal and mental.") "Spirit Guide" (ability :name "Spirit Guide") "Spiritual Affinity" (ability :name "Spiritual Affinity" :summary "* Death: Enter the Spirit Realm") :Totem (ability :name "Totem") "Vision Quest" (ability :name "Vision Quest"))) :Sympathy (power :name "Sympathy" :reference "* Synchronicity is a phenomenon where people interpret two seemingly unrelated experiences as being meaningfully intertwined." :summary "* Sympathetic magic is using a symbol to represent the thing you want to affect with your magic. Whatever you do to the symbol, you do to the target. The object and the thing it represents are 'in sympathy'; they are aligned. Sympathetic magic is a useful idea because often, your target is something non-physical, or something you can’t otherwise interact with directly. You could banish negative thoughts directly, but it’s easier to tie them to something physical by writing them down and then burning the paper. As the paper burns, so does the negativity. Correspondences are related to this. For example, different-colored candles represent different desires (like green for money, red for love, black for banishment, etc.) and as the candle burns down, your spell is cast. Wearing different stones or crystals can attract luck or success to you. * Cursed Energy - Cursed energy is born from negative emotions such as grief and anger. These negative feelings are common in human society so almost everyone possesses cursed energy. Cursed Energy can be controlled and focused to perform various magical feats. * Cursed Spirit - Cursed Spirits are apparitions manifested entirely from cursed energy. Even their bodies are composed of cursed energy, making cursed spirits invisible to non-sorcerers. The emission of cursed energy from humans collects like sediment until a cursed spirit is born from the collective negative energy. Cursed Spirits born with strong feelings directed toward a certain aspect are especially strong. The stronger humanity's fear and anger is directed at cursing a certain aspect of the world, like natural disasters, the more powerful Curse Spirits spawned from those negative sentiments will be. * Law of Similarity - Like produces like. An effect resembles its cause. * Law of Contact/Contagion - Things which have once been in contact with each other continue to act on each other at a distance." :titles "Correspondence, Curses, Sympathetic Magic, Synchonicity, Voodoo, Witch man, Witchdoctor" :abilitymap (abilitymap "Black Vise" (ability :name "Black Vise" :summary "* Target must use a special [Ability] each [Turn] or take a [Stun].") "Breath of Life" (ability :name "Breath of Life" :summary "* Create an [Animated] creature." :titles "Cursed Corpse") "Cursed Sight" (ability :name "Cursed Sight" :summary "* Curses and Cursed Spirits are normally invisibile, but this ability allows them to be seen.") "Cursed Tool" (ability :name "Cursed Tool") "Cursed Weapon" (ability :name "Cursed Weapon" :summary "* Cursed Item - Items can also be infused with Curse Energy including such as cursed tools, cursed objects, and cursed corpses.") "Dominant Possession" (ability :name "Dominant Possession" :summary "* After defeating a target in mental combat, the user possesses the body of the target. The user keeps his Mind and Will stats and uses the target's Body." :titles "Skinriding") :Effigy (ability :name "Effigy" :reference "Poppet, Voodoo Doll" :summary "* Create a figure representing the target. The target can be a being, a vehicle, a building, etc. The figure can be a doll, a wax figurine, an Origami, a sculpture, a drawing, or any other image created by hand by the caster. In addition, the Effigy must have some item linking it to the target. This can be a possession, a hair, a body part, etc. The more significant the better. * Spells may then be cast upon the figure as if the figure was at 4 spaces range regardless of actual distance or line of sight. This ability can create any number of effects, but it cannot actually cause physical damage. All Body damage becomes [Stun] if the target cannot take anymore [Stun], the excess is ignored. * The ability level of any Spells cast are [Limited] by the skill with which the Effigy is created and the significance of the item linked to the Effigy." :titles "Straw Man") :Fetish (ability :name "Fetish" :summary "* A fetish is a small object that can be used to bind a spirit. The item must be unique and may be found or created. * [Action]: If you killed an extradimensional creatures last turn, you may capture the spirit of that creature in the Fetish. * [Action]: Release the spirit in the fetish to perform one task that turn. The spirit must perform the task if it is able though it does so under duress and may twist the intentions or deceive the user. Regardless of outcome, the spirit is released and will disappear.") :Figurine (ability :name "Figurine" :summary "* A miniature of a small creature grows into a full size version.") "Iron Maiden" (ability :name "Iron Maiden" :summary "* Target takes 1 Stun Token for each point of combat damage it inflicts." :titles "Thorns") :Juju (ability :name "Juju" :summary "* The most horrific of fetishes, the shrunken head permanently holds the spirit of the slain person in an undead limbo. A shrunken head may only be created immediately after the user directly slays a person. After that a gruesome series of rituals over the next week mummifies the head and binds the spirit to the head. * [Action]: Once per day, for 1 hour, the user may speak to the head and the head will telepathically respond. The head is effectively a prisoner of the user, and the user may interrogate or torment the head as he sees fit. The head cannot remain silent, but it does not have to be helpful or truthful." :titles "Shrunken Head, Tsantsa") "Life-like Art" (ability :name "Life-like Art") "Life-like Tattoo" (ability :name "Life-like Tattoo") "Living Tool" (ability :name "Living Tool" :summary "* Animates a small tool which makes the next skill easier. * [Requires]: A simple tool with no moving parts. * [Action]: On the next action the tool may be used at [+1 Skill].") "Living Weapon" (ability :name "Living Weapon" :summary "* Animates a melee weapon which makes the next attack easier. * [Requires]: A melee weapon with no moving parts. * [Action]: On the next action the weapon may be used at [+1 Skill].") :Miniature (ability :name "Miniature" :summary "* A miniature of a simple item grows into a full size version.") :Puppeteer (ability :name "Puppeteer" :summary "* When this unit acts the target unit must perform the same actions.") :Rack (ability :name "Rack" :summary "* Each time Target uses a special [Ability] it takes a [Stun].") :Serendipity (ability :name "Serendipity") "Spirit Bottle" (ability :name "Spirit Bottle" :summary "* Create a bottle, mirror, or vase that captures and holds the Spirit of a being. If the being's body dies, the spirit continues to exist in the bottle. The spirit may mentally communicate with anyone touching the bottle.") "Spirit Link" (ability :name "Spirit Link" :summary "* Create a bond with target. Each time it does damage to a target, remove 1 white token from yourself.") "Subtle Possession" (ability :name "Subtle Possession" :summary "* The user's spirit secretly enters the body of the target. The user acts as a manipulative inner voice to the target.") "Sympathetic Bond" (ability :name "Sympathetic Bond" :summary "* [Action]: Bond with a willing unit. * [Action]: Transmit an emotion to a bonded unit.") "True Name" (ability :name "True Name" :summary "* If the user knows the True Name of his subject, he gains +1 [Synchonicity] against that subject."))))))) "Magic Items" (chapter :name "Magic Items" :sectionmap (sectionmap "Magic Weapons" (section :name "Magic Weapons" :itemmap (itemmap "Ascalan Lance" (item :name "Ascalan Lance" :reference "* The lance (or in some versions of the story, sword) that Saint George used to slay the dragon, named after the city Ashkelon." :titles "Dragon Slayer Lance") :Firebrand (item :name "Firebrand" :titles "Flame Tongue") :Frostbrand (item :name "Frostbrand") :Moonblade (item :name "Moonblade" :titles "A silver sword that is as hard as steel") "Poseidon's Net" (item :name "Poseidon's Net") "Poseidon's Trident" (item :name "Poseidon's Trident") :Runestaff (item :name "Runestaff" :summary "* A staff with one or more Runes incribed upon it.") :Runesword (item :name "Runesword" :summary "* A sword with one or more Runes incribed upon it."))))))))
nx/tactics/books/magic / tacticsbook
Description:
Function Name:
  • tacticsbook
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func tacticsbook : base/book (book :name "Magic" :image "Magick.jpg" :chaptermap (chaptermap "Magic Overview" (chapter :name "Magic Overview" :summary "* The Art Classifications * Abjuration - Protective Magic. They create barriers, negate abilities, harm trespassers, or banish those who do not belong. It includes Barriers and Wards.") "Magical Skills" (chapter :name "Magical Skills" :sectionmap (sectionmap :Spiritualism (section :name "Spiritualism" :powermap (powermap :Divination (power :name "Divination" :reference "* Casting: In various methods of divination, stones, cards, sticks and other objects are cast onto the ground or a special cloth so that an insight into the life patterns can be revealed. * Querent: In divination and ritual, the querent is the asker of questions. * Scrying: This is the area of divining by gazing into a reflecting surface." :summary "* Divination is the practice of discovering the unknown. It can foresee the future, find hidden things, uncover lost lore, and reveal deception. * Practitioners may see the many roads to the future and may choose the path that favors themselves and hinders their foes. * Fortune telling is more interested in predicting future events. Rather, divination tends to be more about discovering information. * It is an accepted truism within magick that divination is imperfect." :titles "Augur, Diviner, Fortune Teller, Oracle, Prophet, Seer, Soothsayer, Visionary" :abilitymap (abilitymap "All Seeing Eye" (ability :name "All Seeing Eye" :reference "The Eye of Providence") :Augury (ability :name "Augury") :Cartomancy (ability :name "Cartomancy" :summary "* The art of reading the future through playing cards or tarot cards.") :Clairaudience (ability :name "Clairaudience") :Clairvoyance (ability :name "Clairvoyance") :Dowsing (ability :name "Dowsing" :summary "* Through the use of a divining rod the user may detect desired items hidden underground below them.") "Fortune Telling" (ability :name "Fortune Telling" :summary "* [Deploy]: Roll vs. target Spirit. If you succeed, you receive +1 on all actions against him this encounter. * Casting - In various methods of divination, bones, stones, cards, sticks and other objects are cast onto the ground or a special cloth so that an insight into the life patterns can be revealed. * Bibliomancy - Reading random passages from a book, such as Liber Legis or the I Ching. * Tea Leaves * Tarot") :Hallmark (ability :name "Hallmark" :summary "* Analyze a magical effect to learn information about its caster.") :Kismet (ability :name "Kismet") "Mirror of Truth" (ability :name "Mirror of Truth" :summary "* Enchant a reflective surface to show the true nature of the reflected scene. This reveals illusions, hidden things, and can even reveal the nature of those concealing terrible secrets.") :Portent (ability :name "Portent" :summary "* Determine if a chosen course of action will tend to be beneficial to the user or not. How it might be beneficial is not known." :titles "Omen") :Postcognition (ability :name "Postcognition") :Precognition (ability :name "Precognition") :Prediction (ability :name "Prediction") :Premonition (ability :name "Premonition") :Prophesy (ability :name "Prophesy") :Providence (ability :name "Providence" :summary "* [Action]: Divine a time and place nearby that will be beneficial if the user goes there. The roll result is not known by the user, and the success determines the benefit.") :Revelation (ability :name "Revelation") :Foresight (ability :name "Foresight" :summary "* Foresight is a passive form of extra-sensory perception whereby a person spontaneously perceives information, in the form of vision, about future events before they happen. It is distinguished from [Precognition] in that it is passive.") "Twist of Fate" (ability :name "Twist of Fate") :Visions (ability :name "Visions") :Wyrding (ability :name "Wyrding")) :specialtymap (specialtymap :Hepatomancy (specialty :name "Hepatomancy" :summary "* The art of divining the future through the examination of a creature's entrails.") :Numerology (specialty :name "Numerology" :summary "* The art of divining the future through the examination of numbers and dates.") :Osteomancy (specialty :name "Osteomancy" :summary "* The art of divining the future through decaying bones.") "Rune Casting" (specialty :name "Rune Casting" :summary "* The art of divining the future through the throwing of small tiles with runes on them.") :Scrying (specialty :name "Scrying" :summary "* This is the art of divining by gazing into a reflecting surface.") :Tasseomancy (specialty :name "Tasseomancy" :summary "* Reading the patterns of tea leaves or coffee grounds left after the person drink it."))) :Dreaming (power :name "Dreaming" :reference "* I don't believe it. That is why you fail. Luke and Yoda - Empire Strikes Back" :summary "* This is the magical art of the [Fae]. * Every child has a sense of wonder that comes with being new to the world. Adults must, of necessity, murder that special innocence in order to grow up. * When humanity turned its collective back on Dreaming, a terrible scourge of disbelief and negation smote the world. Hope, trust, and imagination were replaced with reason, pessimism, and scrutiny. By dismissing hope and faith, humanity avoids being hurt by its failure. Shutting out mystery and dreams anesthetizes fear, but deadens beauty as well and leads to apathy, callosuness, and close-mindedness. Though Banality is a mindless force, it is feared by the [Fae] more than any monster or villain. It is an enemy unlike anything the [Fae] have ever encountered, and they are largely helpless in its grasp. * Dreaming is never the same, so any Dreaming effect must be a uniquely crafted idea or it will automatically fail." :titles "Glamour" :abilitymap (abilitymap "As if in a Dream" (ability :name "As if in a Dream" :summary "* Confuse a target's senses to perceive a single thing incorrectly.") "Concoct Dream Essence" (ability :name "Concoct Dream Essence" :summary "* Dreams caught with [Dreamcatching] can be contained in a bottle called [Dream Essence]. Opening the bottle releases the experience of the dream to all surrounding it.") "Create Chimera" (ability :name "Create Chimera" :summary "A Chimera is an imaginary creation. It exists only to the user, though those with magical abilities, young children and the mentally impaired may see them. They only can affect those who can see them.") "Down the Rabbit Hole" (ability :name "Down the Rabbit Hole" :summary "* [Requires]: A hole that leads somewhere unknown. * [Action]: By entering a hole, the Dreamer may travel to the [Spirit Realm]. If the Dreamer is a native of the [Spirit Realm], he may stay as long as he wants. If not, he will return to the real world after [Skill] hours as if waking from a dream.") :Dreamcatching (ability :name "Dreamcatching") :Dreamquest (ability :name "Dreamquest" :summary "* [Requires]: Sleeping * [Action]: While asleep, Spirit enters the [Spirit Realm]. The Spirit may travel as long as it wants, but whenever the Body awakens, the Spirit immediately returns. * [Death]: Spirit may permanently enter the [Spirit Realm].") "Dream Effectively" (ability :name "Dream Effectively" :reference "* I was just thinking. Wouldn't it be funny if I wasn't the only one who could dream effectively? What if everybody could do it? And reality was being pulled out from under us all the time - and we didn't even know it? - George Orr, The Lathe of Heaven * Oh, my God... I just killed six billion people... - George Orr, The Lathe of Heaven") "Dream Riding" (ability :name "Dream Riding" :summary "* Ability to enter another person's dream.") "Dream Sight" (ability :name "Dream Sight") "Dream Speak" (ability :name "Dream Speak" :summary "* Grants the ability to converse with things that cannot normally speak including plants, animals, and inanimate objects. Such beings have knowledge and personalities limited by their natures.") "Dream Weaving" (ability :name "Dream Weaving" :reference "* She was shaping a world. She could envision the world, feel the spring of the earth beneath her bare feet, the warmth of the sun, the vibrant green of the grass, the hazy blue of distant mountains. 'Do you feel it?' 'Yes.' 'Then make it real.' She brought all of her will to paint all the details of the dream onto a new reality. She opened her eyes and gazed out upon the land she had already seen in her mind. It was so beautiful it took her breath away ... and failed to return it. She gasped as her lungs emptied and her vision faded to black ... 'A useful lesson. You forgot to breathe in the scents of your world that would indicate air. Remember even the smallest detail is crucial.' - Tales of Magick") :Epiphany (ability :name "Epiphany" :summary "* A moment of ecstasy, delight, and intense revelation. During epiphanies, disparate things suddenly synchronize and make sense. Ephipanies often trigger major changes in personality or goals.") "Eyes of a Child" (ability :name "Eyes of a Child" :summary "* All Chimera become visible to those you chose.") "Fond Memories" (ability :name "Fond Memories" :reference "Eternal Sunshine of the Spotless Mind" :summary "* This ability makes every childhood dream and ambition real again. Every imaginary friend is remembered clearly and the happiest moments from youth return with the intensity of a first kiss and the excitement of Christmas. Then, suddenly, its over. In their absence, depression can crash down. Truly fallen beings can become suicidal. The remembrance can be uplifting in the end, allowing one to relive the best moments of life.") "Imaginary Friend" (ability :name "Imaginary Friend" :reference "* As I was walking up the stair, I met a man who wasn't there. He wasn't there again today. If only he would go away. - Children's Nursery Rhyme * Mother, do you remember when I was little, I had a friend, he was make-believe? No. Don't you remember? Only I could see him? No, I don't remember Drop Dead Fred at all. - Drop Dead Fred * Let's write something on the carpet... I know how about 'Mother SUCKS'. - Drop Dead Fred" :summary "Create a character with a distinct personality of your choice that only the target can see.") "Living Nightmare" (ability :name "Living Nightmare" :summary "* A chimerical monster formed from nightmares or madness." :titles "Waking Nightmare") "Nightmare Essence" (ability :name "Nightmare Essence" :summary "* Nightmares caught with [Dreamcatching] can be contained in a bottle. Opening the bottle releases the experience of the dream to all surrounding it. These can be used as grenades.") "Pillow Fort" (ability :name "Pillow Fort" :summary "* By exercising one's imagination, a soft barrier can provide real defense but only for the Dreamer. * [Action]: Any material may be chosen to provide [Skill] defense for the user.") :Rapture (ability :name "Rapture" :summary "* An extremely difficult and rare ability of self-discovery to create Glamour from oneself. Only at a moment of sudden self-realization can a Rapture be attained. * [Passive] - While in a Rapture, all [Critical] results generate [Glamour Token]s.") :Ravaging (ability :name "Ravaging" :summary "* Drain creativity from a subject. The subject must be well known and a good knowledge of how the subject dreams is required. After that, the subject must simply be touched and he/she will experience a wave of depression and fear as the Glamour is drained from them. * [Action]: Touch the subject. Roll [Banality]. Gain +1 [Glamour Token] if any successes. If no [Glamour] is gained, both the user and subject gain +1 [Banality] instead.") :Reverie (ability :name "Reverie" :summary "* Say or suggest things that inspire others to wonderful ideas and creations. This is a time-consuming process to discover they subtle things that inspire another to great works. * [Extended Action]: Inspire someone while they create. * [Action]: View a work of art created during Reverie. Gain +1 [Glamour Token]. A particular work of art may only grant this bonus once a year." :titles "Muse") :Seeming (ability :name "Seeming" :summary "* Take on the appearance of another.") "Shattered Dreams" (ability :name "Shattered Dreams") "Wall of Wonders" (ability :name "Wall of Wonders" :summary "* A wall of dreams. Causes [Fascination] in those who view it."))) :Enchantment (power :name "Enchantment" :summary "* Enchantment/Witchcraft focuses on enchantments that alter the fate of the target. * The deities of Witchcraft are embodiments of a life-force manifest in nature. The Goddess and God are seen as complementary polarities and this balance is seen in nature. They are sometimes symbolised as the Sun and Moon, and from her lunar associations the Goddess becomes a Triple Goddess with aspects of Maiden, Mother, and Crone. Some hold the Goddess to be pre-eminent, since she contains and conceives all. The God is the spark of life and inspiration within her, simultaneously her lover and her child." :titles "Abjuration, Beguiler, Enchanter, Enchantress, Entrancer, Hexer, Warlock, Witch, Witchcraft, Witchdoctor" :abilitymap (abilitymap "Barren Loins" (ability :name "Barren Loins" :summary "* Target cannot conceive a child while under this curse.") :Charm (ability :name "Charm" :summary "* The opposite of [Malediction]. Charm reduces the severity of negative effects. * [Requires]: Target cannot have any [Charm] Tokens. * [Action]: Roll vs. Spirit and add a Black [Charm] Token for each [Hit]." :titles "Warding Sign") "Death Ward" (ability :name "Death Ward" :summary "* Provides increased defense against undead beings.") "Evil Eye" (ability :name "Evil Eye" :summary "* Reduces Spirit") "Fertile Loins" (ability :name "Fertile Loins" :summary "* Next intercourse will have doubled chance to conceive a child, if possible.") :Haste (ability :name "Haste" :summary "* [Effect]: +1 Move * [Target]: [Area] * [Duration]: [Hits]") "Inscribe Rune" (ability :name "Inscribe Rune" :summary "* Allows the permanent addition of magical properties to an item.") "Inscribe Symbol" (ability :name "Inscribe Symbol" :summary "* Allows the temporary addition of magical properties to an item, portal, or area.") :Malediction (ability :name "Malediction" :summary "* The opposite of [Charm]. Malediction increases the severity of negative effects. * [Action]: Roll vs. Spirit and add a Black [Curse] Token for each [Hit].") "Magic Ward" (ability :name "Magic Ward" :summary "* Provides increased defense against magical creatures.") "Mental Ward" (ability :name "Mental Ward" :summary "* Provides increased defense against mental attacks.") "Metal Ward" (ability :name "Metal Ward" :summary "* Provides increased defense against predominately metal weapons.") "Nature Ward" (ability :name "Nature Ward" :summary "* Provides increased defense against Animals, and weather.") :Palsy (ability :name "Palsy" :summary "* Reduces Move") :Pox (ability :name "Pox" :summary "* Reduces Social Skills") "Rule of Three" (ability :name "Rule of Three" :reference "* Ever mind the Rule of Three, three times what thou givest returns to thee, this lesson well, thou must learn, thee only gets what thou dost earn." :summary "* Whatever energy a person puts out into the world, be it positive or negative, will be returned to that person three times.") :Safekeep (ability :name "Safekeep" :summary "* [Action]: Enchant an item to prevent loss or theft. Any effect that would remove, loose, or damage the item must roll vs. Safekeep or fail in addition to any other checks.") :Slow (ability :name "Slow" :summary "* [Effect]: -1 Move * [Target]: [Area] * [Duration]: [Hits]") "Spirit Ward" (ability :name "Spirit Ward" :summary "* Provides increased defense against spirit beings and attack against [Spirit].") "Stone Ward" (ability :name "Stone Ward" :summary "* Provides increased defense against predominately stone weapons.") :Weaken (ability :name "Weaken" :summary "* Reduces Body") "Wood Ward" (ability :name "Wood Ward" :summary "* Provides increased defense against predominately wooden weapons."))) :Shamanism (power :name "Shamanism" :titles "Shaman, Spirit Caller, Witch Doctor" :abilitymap (abilitymap "Call Spirits" (ability :name "Call Spirits") "Control Spirit" (ability :name "Control Spirit") :Reincarnate (ability :name "Reincarnate" :summary "* Similar to [Resurrect], this ability allows a being to return to life in a new body if this ritual is performed soon after death. The reincarnated being will be physically different from the original, potentially different age, abilities, gender, race, or species. The being will have most of its original memories, but will often have a substantially different personality. If any [Successes] are made, the reincarnation succeeds and the character must be created again with significant differences and will appear in a location consistent with its new identity. The new character is built at a level equal to it original level or the reincarnate skill level whichever is lower. If the reincarnate skill level is lower than 10, the reincarnated being will be -10% younger than before for each level below 10.") "Second Sight" (ability :name "Second Sight" :reference "* I've got electric light, and I've got second sight. I've got amazing...powers...of observation. And that is how I know...When I try to get through...On the telephone to you...There will be nobody home. - Pink Floyd, Nobody Home" :summary "* Second sight is the ability to see the spiritual essence of beings. It quickly identifies the living from the unliving and can detect disease both phyiscal and mental.") "Spirit Guide" (ability :name "Spirit Guide") "Spiritual Affinity" (ability :name "Spiritual Affinity" :summary "* Death: Enter the Spirit Realm") :Totem (ability :name "Totem") "Vision Quest" (ability :name "Vision Quest"))) :Sympathy (power :name "Sympathy" :reference "* Synchronicity is a phenomenon where people interpret two seemingly unrelated experiences as being meaningfully intertwined." :summary "* Sympathetic magic is using a symbol to represent the thing you want to affect with your magic. Whatever you do to the symbol, you do to the target. The object and the thing it represents are 'in sympathy'; they are aligned. Sympathetic magic is a useful idea because often, your target is something non-physical, or something you can’t otherwise interact with directly. You could banish negative thoughts directly, but it’s easier to tie them to something physical by writing them down and then burning the paper. As the paper burns, so does the negativity. Correspondences are related to this. For example, different-colored candles represent different desires (like green for money, red for love, black for banishment, etc.) and as the candle burns down, your spell is cast. Wearing different stones or crystals can attract luck or success to you. * Cursed Energy - Cursed energy is born from negative emotions such as grief and anger. These negative feelings are common in human society so almost everyone possesses cursed energy. Cursed Energy can be controlled and focused to perform various magical feats. * Cursed Spirit - Cursed Spirits are apparitions manifested entirely from cursed energy. Even their bodies are composed of cursed energy, making cursed spirits invisible to non-sorcerers. The emission of cursed energy from humans collects like sediment until a cursed spirit is born from the collective negative energy. Cursed Spirits born with strong feelings directed toward a certain aspect are especially strong. The stronger humanity's fear and anger is directed at cursing a certain aspect of the world, like natural disasters, the more powerful Curse Spirits spawned from those negative sentiments will be. * Law of Similarity - Like produces like. An effect resembles its cause. * Law of Contact/Contagion - Things which have once been in contact with each other continue to act on each other at a distance." :titles "Correspondence, Curses, Sympathetic Magic, Synchonicity, Voodoo, Witch man, Witchdoctor" :abilitymap (abilitymap "Black Vise" (ability :name "Black Vise" :summary "* Target must use a special [Ability] each [Turn] or take a [Stun].") "Breath of Life" (ability :name "Breath of Life" :summary "* Create an [Animated] creature." :titles "Cursed Corpse") "Cursed Sight" (ability :name "Cursed Sight" :summary "* Curses and Cursed Spirits are normally invisibile, but this ability allows them to be seen.") "Cursed Tool" (ability :name "Cursed Tool") "Cursed Weapon" (ability :name "Cursed Weapon" :summary "* Cursed Item - Items can also be infused with Curse Energy including such as cursed tools, cursed objects, and cursed corpses.") "Dominant Possession" (ability :name "Dominant Possession" :summary "* After defeating a target in mental combat, the user possesses the body of the target. The user keeps his Mind and Will stats and uses the target's Body." :titles "Skinriding") :Effigy (ability :name "Effigy" :reference "Poppet, Voodoo Doll" :summary "* Create a figure representing the target. The target can be a being, a vehicle, a building, etc. The figure can be a doll, a wax figurine, an Origami, a sculpture, a drawing, or any other image created by hand by the caster. In addition, the Effigy must have some item linking it to the target. This can be a possession, a hair, a body part, etc. The more significant the better. * Spells may then be cast upon the figure as if the figure was at 4 spaces range regardless of actual distance or line of sight. This ability can create any number of effects, but it cannot actually cause physical damage. All Body damage becomes [Stun] if the target cannot take anymore [Stun], the excess is ignored. * The ability level of any Spells cast are [Limited] by the skill with which the Effigy is created and the significance of the item linked to the Effigy." :titles "Straw Man") :Fetish (ability :name "Fetish" :summary "* A fetish is a small object that can be used to bind a spirit. The item must be unique and may be found or created. * [Action]: If you killed an extradimensional creatures last turn, you may capture the spirit of that creature in the Fetish. * [Action]: Release the spirit in the fetish to perform one task that turn. The spirit must perform the task if it is able though it does so under duress and may twist the intentions or deceive the user. Regardless of outcome, the spirit is released and will disappear.") :Figurine (ability :name "Figurine" :summary "* A miniature of a small creature grows into a full size version.") "Iron Maiden" (ability :name "Iron Maiden" :summary "* Target takes 1 Stun Token for each point of combat damage it inflicts." :titles "Thorns") :Juju (ability :name "Juju" :summary "* The most horrific of fetishes, the shrunken head permanently holds the spirit of the slain person in an undead limbo. A shrunken head may only be created immediately after the user directly slays a person. After that a gruesome series of rituals over the next week mummifies the head and binds the spirit to the head. * [Action]: Once per day, for 1 hour, the user may speak to the head and the head will telepathically respond. The head is effectively a prisoner of the user, and the user may interrogate or torment the head as he sees fit. The head cannot remain silent, but it does not have to be helpful or truthful." :titles "Shrunken Head, Tsantsa") "Life-like Art" (ability :name "Life-like Art") "Life-like Tattoo" (ability :name "Life-like Tattoo") "Living Tool" (ability :name "Living Tool" :summary "* Animates a small tool which makes the next skill easier. * [Requires]: A simple tool with no moving parts. * [Action]: On the next action the tool may be used at [+1 Skill].") "Living Weapon" (ability :name "Living Weapon" :summary "* Animates a melee weapon which makes the next attack easier. * [Requires]: A melee weapon with no moving parts. * [Action]: On the next action the weapon may be used at [+1 Skill].") :Miniature (ability :name "Miniature" :summary "* A miniature of a simple item grows into a full size version.") :Puppeteer (ability :name "Puppeteer" :summary "* When this unit acts the target unit must perform the same actions.") :Rack (ability :name "Rack" :summary "* Each time Target uses a special [Ability] it takes a [Stun].") :Serendipity (ability :name "Serendipity") "Spirit Bottle" (ability :name "Spirit Bottle" :summary "* Create a bottle, mirror, or vase that captures and holds the Spirit of a being. If the being's body dies, the spirit continues to exist in the bottle. The spirit may mentally communicate with anyone touching the bottle.") "Spirit Link" (ability :name "Spirit Link" :summary "* Create a bond with target. Each time it does damage to a target, remove 1 white token from yourself.") "Subtle Possession" (ability :name "Subtle Possession" :summary "* The user's spirit secretly enters the body of the target. The user acts as a manipulative inner voice to the target.") "Sympathetic Bond" (ability :name "Sympathetic Bond" :summary "* [Action]: Bond with a willing unit. * [Action]: Transmit an emotion to a bonded unit.") "True Name" (ability :name "True Name" :summary "* If the user knows the True Name of his subject, he gains +1 [Synchonicity] against that subject."))))))) "Magic Items" (chapter :name "Magic Items" :sectionmap (sectionmap "Magic Weapons" (section :name "Magic Weapons" :itemmap (itemmap "Ascalan Lance" (item :name "Ascalan Lance" :reference "* The lance (or in some versions of the story, sword) that Saint George used to slay the dragon, named after the city Ashkelon." :titles "Dragon Slayer Lance") :Firebrand (item :name "Firebrand" :titles "Flame Tongue") :Frostbrand (item :name "Frostbrand") :Moonblade (item :name "Moonblade" :titles "A silver sword that is as hard as steel") "Poseidon's Net" (item :name "Poseidon's Net") "Poseidon's Trident" (item :name "Poseidon's Trident") :Runestaff (item :name "Runestaff" :summary "* A staff with one or more Runes incribed upon it.") :Runesword (item :name "Runesword" :summary "* A sword with one or more Runes incribed upon it."))))))))
nx/tactics/books/medieval
Description:
Package Name:
  • nx/tactics/books/medieval
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
Functions:
  • tacticsbook
Source Code:
  • (package nx/tactics/books/medieval :libs (lib base :path nx/tactics/base)) (func tacticsbook : base/book (book :name "Medieval" :image "Medieval-2-Total-War-Kingdoms-642.jpg" :chaptermap (chaptermap "Medieval Overview" (chapter :name "Medieval Overview" :sectionmap (sectionmap "Medieval Land Warfare" (section :name "Medieval Land Warfare" :summary "* Infantry * Formations * Axemen * Polearms * Cavalry * Horse Archers * Armored Cavalry * Knights * Elephants * Chariots * Archers * Longbows * Crossbows * Siege * Ballista * Catapult * Fortifications"))) "Medieval Scenarios" (chapter :name "Medieval Scenarios" :sectionmap (sectionmap "Medieval Events" (section :name "Medieval Events" :scenariomap (scenariomap :Assassination (scenario :name "Assassination") "Bandit Raid" (scenario :name "Bandit Raid" :reference "Seven Samurai") :Battle (scenario :name "Battle") :Ceremony (scenario :name "Ceremony") :Contest (scenario :name "Contest") :Courier (scenario :name "Courier") :Deserters (scenario :name "Deserters") :Duel (scenario :name "Duel") "Empty Battlefield" (scenario :name "Empty Battlefield") :Escort (scenario :name "Escort") "Fist Fight" (scenario :name "Fist Fight") :Highwaymen (scenario :name "Highwaymen") :Hunt (scenario :name "Hunt") "Noble Hunt" (scenario :name "Noble Hunt") "Noble Party" (scenario :name "Noble Party" :reference "Cinderella") "Peasant Demonstration" (scenario :name "Peasant Demonstration" :summary "* Put down or support minor uprisings.") "Peasant Discontent" (scenario :name "Peasant Discontent" :summary "* Put down or support minor uprisings.") "Peasant Uprising" (scenario :name "Peasant Uprising" :summary "* Put down or support a major uprising.") :Quest (scenario :name "Quest") "Scouting Mission" (scenario :name "Scouting Mission") :Spying (scenario :name "Spying") "Visiting Dignitary" (scenario :name "Visiting Dignitary"))))) "Medieval Items" (chapter :name "Medieval Items" :sectionmap (sectionmap "Medieval Firearms" (section :name "Medieval Firearms" :itemmap (itemmap "760mm Arquebus" (item :name "760mm Arquebus" :summary "In terms of accuracy, the arquebus was unable to match the accuracy of a bow in the hands of a highly-skilled archer. However, the arquebus had a faster rate of fire than the most powerful crossbow, had a shorter learning curve than a longbow, and was more powerful than either. An arquebusier could carry more ammunition and powder than a crossbowman or longbowman could with bolts or arrows. Once the methods were developed, powder and shot were relatively easy to mass-produce, while arrow making was a genuine craft requiring highly skilled labor. The weapon also had the added advantage of frightening enemies (and horses) with the noise. Wind can reduce the accuracy of archery, but has much less of an effect on an arquebusier. Perhaps most important, producing an effective arquebusier required much less training than producing an effective bowman. As low-velocity firearms, they were used against enemies that were often partially or fully protected by steel-plate armour. Plate armour was standard in European combat from about 1400 until the middle of the 17th century. Good suits of plate would usually stop an arquebus ball at long range. It was a common practice to 'proof' (test) armour by firing a pistol or arquebus at a new breastplate. The small dent would be circled by engraving, to call attention to it. However, at close range, it was possible to pierce even the armor of knights and other heavy cavalry," :muzzlevelocity "449m/s"))))) "Medieval English" (chapter :name "Medieval English" :sectionmap (sectionmap "Medieval English Infantry" (section :name "Medieval English Infantry" :unitmap (unitmap "English Longbowman" (unit :name "English Longbowman"))))) "Medieval French" (chapter :name "Medieval French" :sectionmap (sectionmap "Medieval French Infantry" (section :name "Medieval French Infantry" :unitmap (unitmap "French Gendarme" (unit :name "French Gendarme" :summary "Founded in 1400s." :classification "Hvy. Cavalry"))))) "Medieval German" (chapter :name "Medieval German") "Medieval Spanish" (chapter :name "Medieval Spanish"))))
nx/tactics/books/medieval / tacticsbook
Description:
Function Name:
  • tacticsbook
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func tacticsbook : base/book (book :name "Medieval" :image "Medieval-2-Total-War-Kingdoms-642.jpg" :chaptermap (chaptermap "Medieval Overview" (chapter :name "Medieval Overview" :sectionmap (sectionmap "Medieval Land Warfare" (section :name "Medieval Land Warfare" :summary "* Infantry * Formations * Axemen * Polearms * Cavalry * Horse Archers * Armored Cavalry * Knights * Elephants * Chariots * Archers * Longbows * Crossbows * Siege * Ballista * Catapult * Fortifications"))) "Medieval Scenarios" (chapter :name "Medieval Scenarios" :sectionmap (sectionmap "Medieval Events" (section :name "Medieval Events" :scenariomap (scenariomap :Assassination (scenario :name "Assassination") "Bandit Raid" (scenario :name "Bandit Raid" :reference "Seven Samurai") :Battle (scenario :name "Battle") :Ceremony (scenario :name "Ceremony") :Contest (scenario :name "Contest") :Courier (scenario :name "Courier") :Deserters (scenario :name "Deserters") :Duel (scenario :name "Duel") "Empty Battlefield" (scenario :name "Empty Battlefield") :Escort (scenario :name "Escort") "Fist Fight" (scenario :name "Fist Fight") :Highwaymen (scenario :name "Highwaymen") :Hunt (scenario :name "Hunt") "Noble Hunt" (scenario :name "Noble Hunt") "Noble Party" (scenario :name "Noble Party" :reference "Cinderella") "Peasant Demonstration" (scenario :name "Peasant Demonstration" :summary "* Put down or support minor uprisings.") "Peasant Discontent" (scenario :name "Peasant Discontent" :summary "* Put down or support minor uprisings.") "Peasant Uprising" (scenario :name "Peasant Uprising" :summary "* Put down or support a major uprising.") :Quest (scenario :name "Quest") "Scouting Mission" (scenario :name "Scouting Mission") :Spying (scenario :name "Spying") "Visiting Dignitary" (scenario :name "Visiting Dignitary"))))) "Medieval Items" (chapter :name "Medieval Items" :sectionmap (sectionmap "Medieval Firearms" (section :name "Medieval Firearms" :itemmap (itemmap "760mm Arquebus" (item :name "760mm Arquebus" :summary "In terms of accuracy, the arquebus was unable to match the accuracy of a bow in the hands of a highly-skilled archer. However, the arquebus had a faster rate of fire than the most powerful crossbow, had a shorter learning curve than a longbow, and was more powerful than either. An arquebusier could carry more ammunition and powder than a crossbowman or longbowman could with bolts or arrows. Once the methods were developed, powder and shot were relatively easy to mass-produce, while arrow making was a genuine craft requiring highly skilled labor. The weapon also had the added advantage of frightening enemies (and horses) with the noise. Wind can reduce the accuracy of archery, but has much less of an effect on an arquebusier. Perhaps most important, producing an effective arquebusier required much less training than producing an effective bowman. As low-velocity firearms, they were used against enemies that were often partially or fully protected by steel-plate armour. Plate armour was standard in European combat from about 1400 until the middle of the 17th century. Good suits of plate would usually stop an arquebus ball at long range. It was a common practice to 'proof' (test) armour by firing a pistol or arquebus at a new breastplate. The small dent would be circled by engraving, to call attention to it. However, at close range, it was possible to pierce even the armor of knights and other heavy cavalry," :muzzlevelocity "449m/s"))))) "Medieval English" (chapter :name "Medieval English" :sectionmap (sectionmap "Medieval English Infantry" (section :name "Medieval English Infantry" :unitmap (unitmap "English Longbowman" (unit :name "English Longbowman"))))) "Medieval French" (chapter :name "Medieval French" :sectionmap (sectionmap "Medieval French Infantry" (section :name "Medieval French Infantry" :unitmap (unitmap "French Gendarme" (unit :name "French Gendarme" :summary "Founded in 1400s." :classification "Hvy. Cavalry"))))) "Medieval German" (chapter :name "Medieval German") "Medieval Spanish" (chapter :name "Medieval Spanish"))))
nx/tactics/books/modern
Description:
Package Name:
  • nx/tactics/books/modern
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
Functions:
  • tacticsbook
Source Code:
  • (package nx/tactics/books/modern :libs (lib base :path nx/tactics/base)) (func tacticsbook : base/book (book :name "Modern" :image "Modern.jpg" :chaptermap (chaptermap "Modern Overview" (chapter :name "Modern Overview" :sectionmap (sectionmap "Modern Aerial Warfare" (section :name "Modern Aerial Warfare" :summary "* Jet Planes * Stealth Fighters * Unmanned Aerial Vehicles (UAV) * Air Cavalry * Flying Fortress * Landing Strips * Aircraft Carriers * Machine Guns * Strafing * Tank Killing * Stealth Bombing * Strategic Bombing * Nuclear Bombing * Cruise Missiles * Fuel Air Explosives * Intercontinental Ballistic Missiles (ICBM)"))) "Cold War" (chapter :name "Cold War" :sectionmap (sectionmap "British Ground Vehicles" (section :name "British Ground Vehicles" :unitmap (unitmap "QF 20 Pounder" (unit :name "QF 20 Pounder"))))) "Modern Ground Vehicles" (chapter :name "Modern Ground Vehicles" :sectionmap (sectionmap "Modern Snowcraft" (section :name "Modern Snowcraft" :summary "* 75% Load, on Snow no Terrain Penalty and 150% Speed, off Snow +1 Terrain Penalty. * Icecraft - On Ice no Terrain Penalty and 200% Speed, off Ice cannot move." :itemmap (itemmap :Iceskates (item :name "Iceskates" :summary "* Personal, Unpowered, Icecraft") "Ice sailboat" (item :name "Ice sailboat" :summary "* Medium, Sail, Icecraft") :Skis (item :name "Skis" :summary "* Personal, Unpowered, Snowcraft") :Snowboard (item :name "Snowboard" :summary "* Personal, Unpowered, Snowcraft") :Snowshoes (item :name "Snowshoes" :summary "* Personal, Unpowered, Snowcraft")) :unitmap (unitmap "Dog Sled" (unit :name "Dog Sled" :summary "* Unpowered, Offroad, Snowcraft") :Snowmobile (unit :name "Snowmobile" :summary "* Offroad, Snowcraft"))))) "The Abyss" (chapter :name "The Abyss" :sectionmap (sectionmap "Abyss Units" (section :name "Abyss Units" :unitmap (unitmap "Construction Submarine" (unit :name "Construction Submarine") "Big Geek" (unit :name "Big Geek") "Little Geek" (unit :name "Little Geek") "Navy Seal" (unit :name "Navy Seal"))))) "Modern Space" (chapter :name "Modern Space" :sectionmap (sectionmap "Modern Space Units" (section :name "Modern Space Units" :unitmap (unitmap :Astronaut (unit :name "Astronaut") "International Space Station" (unit :name "International Space Station") "Space Shuttle" (unit :name "Space Shuttle"))))) "Modern Cops and Robbers" (chapter :name "Modern Cops and Robbers" :sectionmap (sectionmap "Modern Crime Gangs" (section :name "Modern Crime Gangs" :unitmap (unitmap :Mafia (unit :name "Mafia") "Tong Gangs" (unit :name "Tong Gangs" :summary "Tongs are local street gangs.") :Triads (unit :name "Triads" :summary "The Triads are like the [Yakuza] offering protection to the locals. This protection normally comes in the form of crushing the competition on the triad's businesses. Unlike the [Yakuza], the triads deal in slavery and are more open in their illegal dealings. Enforcement is very brutal.") :Yakuza (unit :name "Yakuza" :summary "Besides weapons and drugs, the Yakuza are the neighborhood protection in many areas and do so far more efficiently than the police. Contrary to the attitudes protrayed in Hollywood, the Yakuza make justice swift and fair for the people they deal with. It has done this way for longer than the United States has been around. The Yakuza is not about random violence and mayhem. It is about order and discipline. Of course, many of the younger members have cast aside traditions and have become violent thugs. Like the Triads, the Yakuza was originally a response to the feudal lords when those who were not samurai had no rights or safety."))))) "Modern Mercenaries" (chapter :name "Modern Mercenaries" :reference "* Blackrock * Millenium's End" :summary "Mercenaries Smuggling Soldiers of Fortune VIP Bodyguards" :sectionmap (sectionmap "Black Eagle Security" (section :name "Black Eagle Security" :summary "* Black Eagle is a large security firm offering 'specialists for hire'. They maintain a strong reputation for effectiveness, discipline, and discretion. Their fees are high, but they are the gold standard when dealing with critical situations on a moment's notice. * Black Eagle is based in Atlanta, Georgia. It maintains branch facilities in Miami, Dubai, the Phillipines, and South Africa. * Black Eagle provides contract security teams to guard embassies for major countries. They also can be engaged for deniable covert actions including: smash and grab, target removal, and cyber espianoge. * Black Eagle is very careful to maintain deniability in all of its activities. It does not have business cards or letter-head or logos. Its personnel are all independent contractors who are always paid by the job, in cash. There is always a risk that Black Eagle personnel will be captured, killed, or imprisoned. Black Eagle values loyalty above all else and will go to great lengths to prove itself when its own people get in trouble. * The true secret to Black Eagle's success is its information network. The company maintains a large database of 'persons of interest' along with psychological profiles and potential future value. Whenever possible, Black Eagle will trade favors instead of cash. They proactively offer help to key individuals who are in trouble, so they can count on those people for help in the future. Black Eagle has influence among numerous politicians, lobbyists, lawyers, judges, military personnel, police, prison guards, prisoners, criminal informants, as well as numerous ordinary people who serve as their eyes and ears on the street."))) "The Prisoner" (chapter :name "The Prisoner" :reference "* Where am I? You are at the village. Who do you work for? That would be telling. What do you want? Information. You won't get it. By hook or by crook, we will. Who are you? I am number 2. Who is number 1? You are number 6. I am not a number. I am a free man. Ha ha ha ha. - The Prisoner * Be seeing you. - The Prisoner") "Special Ops" (chapter :name "Special Ops" :summary "Special Ops Black Ops Deniable Insurgencies Impossible Missions Hostage Rescue") "Modern Spies" (chapter :name "Modern Spies" :sectionmap (sectionmap "Spy Units" (section :name "Spy Units" :unitmap (unitmap "CIA Agent" (unit :name "CIA Agent") "NSA Agent" (unit :name "NSA Agent") :Terrorist (unit :name "Terrorist") "Aaron Jorgenson" (unit :name "Aaron Jorgenson" :summary "* Wealthy Norwegian shipping magnate with subsidiaries in petroleum products, trucking, and pharmaceuticals. * He is an ultra-conservative and has served several terms in public office. * He was married and divorced (his wife died of natural causes soon after the divorce). * He has no heirs or family. * At 56, he is also dying of an inoperable brain tumor. * His greatest possessions are his fabulous collection of artwork in his luxurious mansion. * Personality - Mr. Jorgenson is an arrogant and selfish man. He is a self-made man and believes that the strong deserve to take what they can and that the weak deserve their lot. He idolizes men of action, especially his Viking ancestors. With only a short time left to live, he has dedicated his fortune to a spectacular plan that would make him a modern day Viking.") "James Bond" (unit :name "James Bond" :summary "* Mr. Bond, you persist in defying my efforts to provide an amusing death for you. - Hugo Drax, Moonraker * Do you expect me to talk. No, Mr. Bond. I expect you to die. - Auric Goldfinger and James Bond, Goldfinger" :titles "007"))))) "Modern Sports" (chapter :name "Modern Sports" :sectionmap (sectionmap "Modern Scenarios" (section :name "Modern Scenarios" :scenariomap (scenariomap "Boxing Match" (scenario :name "Boxing Match") "Soccer Game" (scenario :name "Soccer Game"))))) "Modern Warfare" (chapter :name "Modern Warfare" :sectionmap (sectionmap "Modern African Ground Vehicles" (section :name "Modern African Ground Vehicles" :unitmap (unitmap :Technical (unit :name "Technical"))))))))
nx/tactics/books/modern / tacticsbook
Description:
Function Name:
  • tacticsbook
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func tacticsbook : base/book (book :name "Modern" :image "Modern.jpg" :chaptermap (chaptermap "Modern Overview" (chapter :name "Modern Overview" :sectionmap (sectionmap "Modern Aerial Warfare" (section :name "Modern Aerial Warfare" :summary "* Jet Planes * Stealth Fighters * Unmanned Aerial Vehicles (UAV) * Air Cavalry * Flying Fortress * Landing Strips * Aircraft Carriers * Machine Guns * Strafing * Tank Killing * Stealth Bombing * Strategic Bombing * Nuclear Bombing * Cruise Missiles * Fuel Air Explosives * Intercontinental Ballistic Missiles (ICBM)"))) "Cold War" (chapter :name "Cold War" :sectionmap (sectionmap "British Ground Vehicles" (section :name "British Ground Vehicles" :unitmap (unitmap "QF 20 Pounder" (unit :name "QF 20 Pounder"))))) "Modern Ground Vehicles" (chapter :name "Modern Ground Vehicles" :sectionmap (sectionmap "Modern Snowcraft" (section :name "Modern Snowcraft" :summary "* 75% Load, on Snow no Terrain Penalty and 150% Speed, off Snow +1 Terrain Penalty. * Icecraft - On Ice no Terrain Penalty and 200% Speed, off Ice cannot move." :itemmap (itemmap :Iceskates (item :name "Iceskates" :summary "* Personal, Unpowered, Icecraft") "Ice sailboat" (item :name "Ice sailboat" :summary "* Medium, Sail, Icecraft") :Skis (item :name "Skis" :summary "* Personal, Unpowered, Snowcraft") :Snowboard (item :name "Snowboard" :summary "* Personal, Unpowered, Snowcraft") :Snowshoes (item :name "Snowshoes" :summary "* Personal, Unpowered, Snowcraft")) :unitmap (unitmap "Dog Sled" (unit :name "Dog Sled" :summary "* Unpowered, Offroad, Snowcraft") :Snowmobile (unit :name "Snowmobile" :summary "* Offroad, Snowcraft"))))) "The Abyss" (chapter :name "The Abyss" :sectionmap (sectionmap "Abyss Units" (section :name "Abyss Units" :unitmap (unitmap "Construction Submarine" (unit :name "Construction Submarine") "Big Geek" (unit :name "Big Geek") "Little Geek" (unit :name "Little Geek") "Navy Seal" (unit :name "Navy Seal"))))) "Modern Space" (chapter :name "Modern Space" :sectionmap (sectionmap "Modern Space Units" (section :name "Modern Space Units" :unitmap (unitmap :Astronaut (unit :name "Astronaut") "International Space Station" (unit :name "International Space Station") "Space Shuttle" (unit :name "Space Shuttle"))))) "Modern Cops and Robbers" (chapter :name "Modern Cops and Robbers" :sectionmap (sectionmap "Modern Crime Gangs" (section :name "Modern Crime Gangs" :unitmap (unitmap :Mafia (unit :name "Mafia") "Tong Gangs" (unit :name "Tong Gangs" :summary "Tongs are local street gangs.") :Triads (unit :name "Triads" :summary "The Triads are like the [Yakuza] offering protection to the locals. This protection normally comes in the form of crushing the competition on the triad's businesses. Unlike the [Yakuza], the triads deal in slavery and are more open in their illegal dealings. Enforcement is very brutal.") :Yakuza (unit :name "Yakuza" :summary "Besides weapons and drugs, the Yakuza are the neighborhood protection in many areas and do so far more efficiently than the police. Contrary to the attitudes protrayed in Hollywood, the Yakuza make justice swift and fair for the people they deal with. It has done this way for longer than the United States has been around. The Yakuza is not about random violence and mayhem. It is about order and discipline. Of course, many of the younger members have cast aside traditions and have become violent thugs. Like the Triads, the Yakuza was originally a response to the feudal lords when those who were not samurai had no rights or safety."))))) "Modern Mercenaries" (chapter :name "Modern Mercenaries" :reference "* Blackrock * Millenium's End" :summary "Mercenaries Smuggling Soldiers of Fortune VIP Bodyguards" :sectionmap (sectionmap "Black Eagle Security" (section :name "Black Eagle Security" :summary "* Black Eagle is a large security firm offering 'specialists for hire'. They maintain a strong reputation for effectiveness, discipline, and discretion. Their fees are high, but they are the gold standard when dealing with critical situations on a moment's notice. * Black Eagle is based in Atlanta, Georgia. It maintains branch facilities in Miami, Dubai, the Phillipines, and South Africa. * Black Eagle provides contract security teams to guard embassies for major countries. They also can be engaged for deniable covert actions including: smash and grab, target removal, and cyber espianoge. * Black Eagle is very careful to maintain deniability in all of its activities. It does not have business cards or letter-head or logos. Its personnel are all independent contractors who are always paid by the job, in cash. There is always a risk that Black Eagle personnel will be captured, killed, or imprisoned. Black Eagle values loyalty above all else and will go to great lengths to prove itself when its own people get in trouble. * The true secret to Black Eagle's success is its information network. The company maintains a large database of 'persons of interest' along with psychological profiles and potential future value. Whenever possible, Black Eagle will trade favors instead of cash. They proactively offer help to key individuals who are in trouble, so they can count on those people for help in the future. Black Eagle has influence among numerous politicians, lobbyists, lawyers, judges, military personnel, police, prison guards, prisoners, criminal informants, as well as numerous ordinary people who serve as their eyes and ears on the street."))) "The Prisoner" (chapter :name "The Prisoner" :reference "* Where am I? You are at the village. Who do you work for? That would be telling. What do you want? Information. You won't get it. By hook or by crook, we will. Who are you? I am number 2. Who is number 1? You are number 6. I am not a number. I am a free man. Ha ha ha ha. - The Prisoner * Be seeing you. - The Prisoner") "Special Ops" (chapter :name "Special Ops" :summary "Special Ops Black Ops Deniable Insurgencies Impossible Missions Hostage Rescue") "Modern Spies" (chapter :name "Modern Spies" :sectionmap (sectionmap "Spy Units" (section :name "Spy Units" :unitmap (unitmap "CIA Agent" (unit :name "CIA Agent") "NSA Agent" (unit :name "NSA Agent") :Terrorist (unit :name "Terrorist") "Aaron Jorgenson" (unit :name "Aaron Jorgenson" :summary "* Wealthy Norwegian shipping magnate with subsidiaries in petroleum products, trucking, and pharmaceuticals. * He is an ultra-conservative and has served several terms in public office. * He was married and divorced (his wife died of natural causes soon after the divorce). * He has no heirs or family. * At 56, he is also dying of an inoperable brain tumor. * His greatest possessions are his fabulous collection of artwork in his luxurious mansion. * Personality - Mr. Jorgenson is an arrogant and selfish man. He is a self-made man and believes that the strong deserve to take what they can and that the weak deserve their lot. He idolizes men of action, especially his Viking ancestors. With only a short time left to live, he has dedicated his fortune to a spectacular plan that would make him a modern day Viking.") "James Bond" (unit :name "James Bond" :summary "* Mr. Bond, you persist in defying my efforts to provide an amusing death for you. - Hugo Drax, Moonraker * Do you expect me to talk. No, Mr. Bond. I expect you to die. - Auric Goldfinger and James Bond, Goldfinger" :titles "007"))))) "Modern Sports" (chapter :name "Modern Sports" :sectionmap (sectionmap "Modern Scenarios" (section :name "Modern Scenarios" :scenariomap (scenariomap "Boxing Match" (scenario :name "Boxing Match") "Soccer Game" (scenario :name "Soccer Game"))))) "Modern Warfare" (chapter :name "Modern Warfare" :sectionmap (sectionmap "Modern African Ground Vehicles" (section :name "Modern African Ground Vehicles" :unitmap (unitmap :Technical (unit :name "Technical"))))))))
nx/tactics/books/modern_fantasy
Description:
Package Name:
  • nx/tactics/books/modern_fantasy
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
Functions:
  • tacticsbook
Source Code:
  • (package nx/tactics/books/modern_fantasy :libs (lib base :path nx/tactics/base)) (func tacticsbook : base/book (book :name "Modern Fantasy" :image "Vampire_Slayer_by_Prasa.jpg" :chaptermap (chaptermap "Modern Fantasy Overview" (chapter :name "Modern Fantasy Overview" :sectionmap (sectionmap "Why Tactics: Modern Fantasy?" (section :name "Why Tactics: Modern Fantasy?"))) "Buffy the Vampire Slayer" (chapter :name "Buffy the Vampire Slayer" :sectionmap (sectionmap "Bad Guys" (section :name "Bad Guys" :unitmap (unitmap :Adam (unit :name "Adam" :image "Buffy/Adam.png" :reference "Adam: [After killing Professor Walsh, his first act of life] Mommy.") :Gentlemen (unit :name "Gentlemen" :image "Buffy/Gentlemen.png" :reference "Can't even shout, can't even cry. The Gentlemen are coming by. Looking in windows, knocking on doors. They need to take seven and they might take yours. Can't call to mom, can't say a word. You're gonna die screaming but you won't be heard. - Hush") :Glory (unit :name "Glory" :image "Buffy/Glory.png" :reference "Glory: Wait, I've always wanted to try this. You know that thing with worms, where if you have one and you rip it in half, you get two worms. Do you think that'll work with you? [Buffy headbutts her] Ow! You hit me. What are you crazy? You can't go around hitting people. What were you, born in a barn? Fine, be that way! [grabs Buffy by the throat] I just noticed something, you have superpowers, that is so cool. Can you fly? [throws Buffy across the room]" :titles "Glorificus, That Which Cannot Be Named, The Beast, Her Splendiferousness, Her Sparkling Luminescence, Oh Sweaty-Naughty-Feelings-Causing One") "Mayor Wilkins" (unit :name "Mayor Wilkins" :image "Buffy/Mayor.png" :reference "Do you think he was going to betray me? Oh, now, that's a horrible thought. And now he's dead, I'll never have the chance to scold him.") :Sweet (unit :name "Sweet" :image "Buffy/Sweet.png" :reference "I can bring whole cities to ruin and still have time to get a soft shoe in ... Something's cooking. I'm at the griddle. I bought Nero his very first fiddle."))))) "Chronicles of Amber" (chapter :name "Chronicles of Amber") "Kengan Ashura" (chapter :name "Kengan Ashura" :summary "* Kengan Matches - In Japan, wealthy business owners resolve disputes by hiring unarmed fighters to duel on their behalf. The match is form of high stakes gambling with large business interests on the line. Though the conflict appears to be fought on stage, a great deal of preparation, manipulation, and deception occur before, during, and after a match. * Rules - A Kengan member may make a 'reasonable' bet of another and challenge them to a Kengan match. The challenge is made known to the other members who may attend and bet on the results. The challenged party may agree to the duel, object, or decline. If they duel, each party chooses a champion and agree to a venue. The results of the battle must be adhered to. Win or lose, both parties rise in status for making the attempt. If the challenged party objects, they may counter offer or claim the challenge is unreasonable. Such disputes are decided by concensus vote among the other members. Poor challenges or objections are frowned upon. If the challenged declines, they are considered to have forfeited and must adhere to the terms and lose status for not participating. * History - During the Edo period of Japan, wealthy merchants stuggled for the best business dealings especially for the Shogun's business needs. Conflicts between merchants became increasingly bloody and reckless until the Shogun put a stop to it by announcing that all such conflicts must be resolved in a single-combat, unarmed duel. The tradition was very successful at keeping the peace and continues to this day.") "Matrix, The" (chapter :name "Matrix, The" :sectionmap (sectionmap :Units (section :name "Units" :unitmap (unitmap "Agent Smith" (unit :name "Agent Smith" :reference "* I hate this place. This zoo. This prison. This reality, whatever you want to call it, I can't stand it any longer. It's the smell, if there is such a thing. I feel saturated by it. I can taste your stink and every time I do, I fear that I've somehow been infected by it. - Agent Smith * You move to an area and you multiply and multiply until every natural resource is consumed and the only way you can survive is to spread to another area. There is another organism on this planet that follows the same pattern. Do you know what it is? A virus. Human beings are a disease, a cancer of this planet. You're a plague and we are the cure. - Agent Smith"))))) "Street Fighter" (chapter :name "Street Fighter" :sectionmap (sectionmap :Shadaloo (section :name "Shadaloo" :unitmap (unitmap :Balrog (unit :name "Balrog" :image "StreetFighter/BalrogToken.png" :unitskillmap (unitskillmap "Close Combat" (unitskill :name "Close Combat" :level "8" :unitspecialtymap (unitspecialtymap :Boxing (unitspecialty :name "Boxing"))))) "M. Bison" (unit :name "M. Bison" :image "StreetFighter/MBisonToken.png" :reference "You come to fight a madman, and instead find a god? Do you still refuse to accept my godhood? Keep your own God! In fact, this time may be a good time to pray to Him!" :unitskillmap (unitskillmap "Close Combat" (unitskill :name "Close Combat" :level "9"))) :Sagat (unit :name "Sagat" :image "StreetFighter/SagatToken.png" :unitskillmap (unitskillmap "Close Combat" (unitskill :name "Close Combat" :level "8" :unitabilitymap (unitabilitymap "Knee Strike" (unitability :name "Knee Strike")) :unitspecialtymap (unitspecialtymap "Muay Thai" (unitspecialty :name "Muay Thai"))))) :Vega (unit :name "Vega" :image "StreetFighter/VegaToken.png" :unitskillmap (unitskillmap "Close Combat" (unitskill :name "Close Combat" :level "8" :unitspecialtymap (unitspecialtymap :Ninjutsu (unitspecialty :name "Ninjutsu"))))))))) "World of Darkness" (chapter :name "World of Darkness" :sectionmap (sectionmap "Paradigm Corporation" (section :name "Paradigm Corporation" :reference "* They say misery loves company We could start a company and make misery Frustrated, Incorporated We I know just what you need I may just have the thing I know what you paid to see Put me out of my misery I'd do it for you Would you do it for me? We will always be busy Making misery We could build a factory And make misery We'll create the cure We made the disease - Misery, Soul Asylum" :summary "* Paradigm appears to be a modest, little known, private corporate consulting and administrative assistance firm. * In reality, it is a vast business conglomerate that does not consult for companies, it owns or controls them through a series of false identities and numbered bank accounts. By secretly controlling multiple related companies, Paradigm has secured powerful, clandestine monopolies. * Unfortunately, Paradigm has a dark secret: its founders are corrupt followers of the [Wyrm], and their goal is nothing less than the gradual destruction of the world. * Paradigm hides its true intentions behind veils of lies, all the while feeding humanity's greed. Instant gratification satisfies the need to covet. That is Paradigm. * Few people outside the company know just how widespread the company is. Paradigm is like a cancer with foul growths quietly growing through healthy flesh until the host dies. * It has vast resources, but the need for secrecy creates limits of how those resources can be used. !Working for Paradigm * Outwardly, Paradigm is a nice place to work. Good benefits, good pay, holiday gifts, suggestion boxes, etc.. Except, sometimes people transfer out of state, never to be heard from again. No retirees ever come back to visit. People who have been around long enough know not to make waves or risk their jobs ... or worse. Better to lay low. * Friendships are discouraged. Personalizing items are not allowed in the workplace 'to keep things professional'. * Family life is your own problem. Work comes first. !Management * The CEO * The Board of Directors * Who runs Paradigm? Supposedly the CEO, but the CEO is not there to run the show; the CEO is there to take the blame when something goes wrong. For this, they are paid exceptionally handsomely when they are forced to 'resign'. The Board of Directors is equally expendable, but for different reasons. Board members are replaced when the stockholders feel the company is not making enough money. * Fortunately, Paradigm spends half of its energy fighting itself. Corrupt, egotistical, power-mongers don't work well together. Back-stabbing, hidden agendas, and subversion are daily activities at the top. !History * Paradigm started in 1865 when Jeremiah Lassater founded Standard Oil. He was a ruthless, opportunist even before the accident. In 1869, while inspecting a problematic drilling site, Lassater became trapped in a tunnel with a fearsome [Bane]. In exchange for his life, he allowed the [Bane] to act through him, and so began the company's long, dark descent." :titles "Pentex" :rulemap (rulemap "Ad Infinitum" (rule :name "Ad Infinitum" :image "Units/ModernFantasy/AdInfinitum.jpg" :summary "* Advertising and Marketing * Television * Communications") "Chrysalis Corporation" (rule :name "Chrysalis Corporation" :image "Units/ModernFantasy/ChyrsalisCorporation.jpg" :summary "* The Price of Beauty * Fashion, Beauty, Hygiene, Self Help, and Diet products * Rising Stars - Chrysalis sponsors a talent agency searching for desparate artists and actors that either can't find their big break or have already used up their 15 minutes of fame. Rising Stars has a good reputation since they give unknowns and has-beens a chance. Of course, they are actually interested in guiding them down a degrading series of lies, drugs, whoring, pornography and other exploitations. In these positions, they earn money and provide a useful spy network for Chrysalis. When they are too old to be of use Chrysalis can always find some use for their bodies. * A New You - This popular diet and exercise program secretly encourages vain and narcissistic tendencies. As the customer becomes stronger and more beautiful, he/she also starts losing friends. But, of course, A New You provides all the friends you might want... * Homogeniety - Chrysalis sponsors a social group dedicated to curing homosexuality. Through them it attracts the despondent and the outcast. Those filled with self doubt are easily duped into undergoing treatments that will make them more Normal. Homogenity is run by Pastor Jim Fowler who despite claiming to be cured of homosexuality, instead preys on youths under his care. If they reject him, he simply claims that they have passed a 'test'.") "Cyberdyne Systems" (rule :name "Cyberdyne Systems" :image "Units/ModernFantasy/Cyberdyne.jpg" :summary "* Cyberdyne is a leading manufacturer of computers, software, microchips, and robotics. * Massively Multiplayer Games - Cyberdyne secretly maintains a presense on many online game sites. Here they cultivate and recruit 'like-minded' players into the corporate fold. Many hackers, dangerous malcontents, and even terrorists have been duped into doing Cyberdyne's dirty work for them.") "Omni Comsume Products (OCP)" (rule :name "Omni Comsume Products (OCP)" :image "Units/ModernFantasy/OmniComsumerProducts.jpg" :reference "The Only Choice - Robocop") "Shinra Electric" (rule :name "Shinra Electric" :image "Units/ModernFantasy/ShinraElectric.jpg" :reference "* A nuclear meltdown, contrary to popular belief, does not involve nuclear material escaping from the cooling towers to spatter the area in nuclear waste. The reality is much worse. * When a fission reactor overheats sufficiently, it will literally 'melt down' through the floor. The core is so dense, that it will keep sinking until it hits bedrock, usually in the water table. * What happens next is nightmarish. The water becomes tainted with radioactivity and flows into wells, streams, rivers, and reserviors. It can poison tens of thousands of square miles in a frighteningly short time. * Worst of all, once a core melts down, it cannot be removed. It will continue pouring out radioactive water until the pile decays which can be a VERY long time indeed. * The Corcord 1 and 2 plants in New Hampshire sit astride the Connecticut River which flows between Vermont and New Hampshire, across Massachusetts, through Hartford and down to the Long Island Sound. This whole area would be poisoned in a meltdown not to mention the slow contamination of the body of water that touches New York City and the Atlantic Ocean." :summary "* Shinra is an electricity provider. Besides power lines, that means Coal and Nuclear.") "Standard Oil" (rule :name "Standard Oil" :image "Units/ModernFantasy/StandardOil.jpg" :reference "* So if I allow your employer to set up operations, they will build six hospitals and provide vaccines for two hundred thousand children living in poverty? What's the catch? We do have something of a corporate conscience, and it bothered our executives to think of all of the poverty and disease and suffering that would be within, well, spitting distance of the site...and if you should refuse this offer, we will make certain that every man, woman, and child in this fleabag of a country knows that you and you alone were responsible for turning down all those hospitals and medicines and jobs. - Regional Negotiations" :summary "* Standard is an international Oil and Petroleum product manufacturer including exploration, drilling, refining, trucking, shipping, gas stations, convenience stores, etc. * Every so often, Standard sponsors something on PBS to make itself known as a 'good corporate citizen', but in general, there is nothing to distinguish the company in the public mind from any other big corporation. Some see this as an advertising failure, but Standard considers this to be camouflage. * 'The cost of the fine is always less than the cost of compliance.' - Corporate policy is very simple: Make as much money as possible, as quickly as possible, with as little overhead as possible. This hell-bent-for-leather profitability grab makes the stockholders happy, though 'as little overhead as possible' translates to as few environmental and safety safeguards as possible. It also means as little maintenance on its tanker fleet as possible. * Of course they can't ignore environmental concerns completely, but they prefer to invest in ad campaigns that equate protecting the environment with lost jobs. Meanwhile, it makes high-profile, low content gestures toward responsibility to maintain the smokescreen. * In the Third World, Standard is especially powerful. They bribe or blackmail local governments to allow them to essentially establish independent fiefdoms complete with private armies. * Oil companys must always produce more oil, so Standard's research and exploration teams are well paid to find the oil WHEREEVER it lies. Oil doesn't respect national borders or religious sites, so neither do they.") "Tyrell Corporation" (rule :name "Tyrell Corporation" :image "Units/ModernFantasy/TyrellCorporation.jpg" :reference "* More Human Than Human - Blade Runner") "Umbrella Pharmaceutical" (rule :name "Umbrella Pharmaceutical" :image "Units/ModernFantasy/UmbrellaCorporation.jpg" :reference "* Our Business is Life Itself - Resident Evil * Regenerate's revolutionary T-Cell formula actually brings dead cells ... back to life. Now your youthful beauty can last ... forever. Always consult your doctor before starting treatment. Some side-effects can occur." :summary "* Pharmaceuticals * Conception Clinics - Umbrella sponsors fertility clinics and sperm banks. They take full advantage of the genetic material they receive and have been known to provide sperm of questionable origins to further their experimentation. They have councilors on staff to help the distraught mothers who for some reason feel that they have something unnatural inside them.") "United Fruit" (rule :name "United Fruit" :image "Units/ModernFantasy/UnitedFruit.jpg" :reference "* United Fruit had a deep and long-lasting impact in the economic and political development of several Latin American countries. Critics often accused it of exploitative neocolonialism and described it as the archetypal example of the influence of a multinational corporation on the internal politics of the so-called 'banana republics.' United Fruit became part of the present-day Chiquita Brands International.") :Weyland-Yutani (rule :name "Weyland-Yutani" :image "Units/ModernFantasy/WeylandYutani.jpg" :reference "* Building Better Worlds - Alien * Halliburton" :summary "* The Company is a manufacturing and construction firm known for innumerable no-bid public works projects for municipal governments and the military." :titles "The Company") "Yoyodyne Propulsion" (rule :name "Yoyodyne Propulsion" :image "Units/ModernFantasy/Yoyodyne.jpg" :reference "* Where the future begins tomorrow - Buckaroo Banzai * Numerous props in Star Trek series indicate that parts of Federation starships were manufactured by Yoyodyne Propulsion Systems or YPS. The creators of Star Trek: The Next Generation were noted fans of Buckaroo Banzai and featured many references to the film in the series." :summary "* Defense contractor"))))))))
nx/tactics/books/modern_fantasy / tacticsbook
Description:
Function Name:
  • tacticsbook
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func tacticsbook : base/book (book :name "Modern Fantasy" :image "Vampire_Slayer_by_Prasa.jpg" :chaptermap (chaptermap "Modern Fantasy Overview" (chapter :name "Modern Fantasy Overview" :sectionmap (sectionmap "Why Tactics: Modern Fantasy?" (section :name "Why Tactics: Modern Fantasy?"))) "Buffy the Vampire Slayer" (chapter :name "Buffy the Vampire Slayer" :sectionmap (sectionmap "Bad Guys" (section :name "Bad Guys" :unitmap (unitmap :Adam (unit :name "Adam" :image "Buffy/Adam.png" :reference "Adam: [After killing Professor Walsh, his first act of life] Mommy.") :Gentlemen (unit :name "Gentlemen" :image "Buffy/Gentlemen.png" :reference "Can't even shout, can't even cry. The Gentlemen are coming by. Looking in windows, knocking on doors. They need to take seven and they might take yours. Can't call to mom, can't say a word. You're gonna die screaming but you won't be heard. - Hush") :Glory (unit :name "Glory" :image "Buffy/Glory.png" :reference "Glory: Wait, I've always wanted to try this. You know that thing with worms, where if you have one and you rip it in half, you get two worms. Do you think that'll work with you? [Buffy headbutts her] Ow! You hit me. What are you crazy? You can't go around hitting people. What were you, born in a barn? Fine, be that way! [grabs Buffy by the throat] I just noticed something, you have superpowers, that is so cool. Can you fly? [throws Buffy across the room]" :titles "Glorificus, That Which Cannot Be Named, The Beast, Her Splendiferousness, Her Sparkling Luminescence, Oh Sweaty-Naughty-Feelings-Causing One") "Mayor Wilkins" (unit :name "Mayor Wilkins" :image "Buffy/Mayor.png" :reference "Do you think he was going to betray me? Oh, now, that's a horrible thought. And now he's dead, I'll never have the chance to scold him.") :Sweet (unit :name "Sweet" :image "Buffy/Sweet.png" :reference "I can bring whole cities to ruin and still have time to get a soft shoe in ... Something's cooking. I'm at the griddle. I bought Nero his very first fiddle."))))) "Chronicles of Amber" (chapter :name "Chronicles of Amber") "Kengan Ashura" (chapter :name "Kengan Ashura" :summary "* Kengan Matches - In Japan, wealthy business owners resolve disputes by hiring unarmed fighters to duel on their behalf. The match is form of high stakes gambling with large business interests on the line. Though the conflict appears to be fought on stage, a great deal of preparation, manipulation, and deception occur before, during, and after a match. * Rules - A Kengan member may make a 'reasonable' bet of another and challenge them to a Kengan match. The challenge is made known to the other members who may attend and bet on the results. The challenged party may agree to the duel, object, or decline. If they duel, each party chooses a champion and agree to a venue. The results of the battle must be adhered to. Win or lose, both parties rise in status for making the attempt. If the challenged party objects, they may counter offer or claim the challenge is unreasonable. Such disputes are decided by concensus vote among the other members. Poor challenges or objections are frowned upon. If the challenged declines, they are considered to have forfeited and must adhere to the terms and lose status for not participating. * History - During the Edo period of Japan, wealthy merchants stuggled for the best business dealings especially for the Shogun's business needs. Conflicts between merchants became increasingly bloody and reckless until the Shogun put a stop to it by announcing that all such conflicts must be resolved in a single-combat, unarmed duel. The tradition was very successful at keeping the peace and continues to this day.") "Matrix, The" (chapter :name "Matrix, The" :sectionmap (sectionmap :Units (section :name "Units" :unitmap (unitmap "Agent Smith" (unit :name "Agent Smith" :reference "* I hate this place. This zoo. This prison. This reality, whatever you want to call it, I can't stand it any longer. It's the smell, if there is such a thing. I feel saturated by it. I can taste your stink and every time I do, I fear that I've somehow been infected by it. - Agent Smith * You move to an area and you multiply and multiply until every natural resource is consumed and the only way you can survive is to spread to another area. There is another organism on this planet that follows the same pattern. Do you know what it is? A virus. Human beings are a disease, a cancer of this planet. You're a plague and we are the cure. - Agent Smith"))))) "Street Fighter" (chapter :name "Street Fighter" :sectionmap (sectionmap :Shadaloo (section :name "Shadaloo" :unitmap (unitmap :Balrog (unit :name "Balrog" :image "StreetFighter/BalrogToken.png" :unitskillmap (unitskillmap "Close Combat" (unitskill :name "Close Combat" :level "8" :unitspecialtymap (unitspecialtymap :Boxing (unitspecialty :name "Boxing"))))) "M. Bison" (unit :name "M. Bison" :image "StreetFighter/MBisonToken.png" :reference "You come to fight a madman, and instead find a god? Do you still refuse to accept my godhood? Keep your own God! In fact, this time may be a good time to pray to Him!" :unitskillmap (unitskillmap "Close Combat" (unitskill :name "Close Combat" :level "9"))) :Sagat (unit :name "Sagat" :image "StreetFighter/SagatToken.png" :unitskillmap (unitskillmap "Close Combat" (unitskill :name "Close Combat" :level "8" :unitabilitymap (unitabilitymap "Knee Strike" (unitability :name "Knee Strike")) :unitspecialtymap (unitspecialtymap "Muay Thai" (unitspecialty :name "Muay Thai"))))) :Vega (unit :name "Vega" :image "StreetFighter/VegaToken.png" :unitskillmap (unitskillmap "Close Combat" (unitskill :name "Close Combat" :level "8" :unitspecialtymap (unitspecialtymap :Ninjutsu (unitspecialty :name "Ninjutsu"))))))))) "World of Darkness" (chapter :name "World of Darkness" :sectionmap (sectionmap "Paradigm Corporation" (section :name "Paradigm Corporation" :reference "* They say misery loves company We could start a company and make misery Frustrated, Incorporated We I know just what you need I may just have the thing I know what you paid to see Put me out of my misery I'd do it for you Would you do it for me? We will always be busy Making misery We could build a factory And make misery We'll create the cure We made the disease - Misery, Soul Asylum" :summary "* Paradigm appears to be a modest, little known, private corporate consulting and administrative assistance firm. * In reality, it is a vast business conglomerate that does not consult for companies, it owns or controls them through a series of false identities and numbered bank accounts. By secretly controlling multiple related companies, Paradigm has secured powerful, clandestine monopolies. * Unfortunately, Paradigm has a dark secret: its founders are corrupt followers of the [Wyrm], and their goal is nothing less than the gradual destruction of the world. * Paradigm hides its true intentions behind veils of lies, all the while feeding humanity's greed. Instant gratification satisfies the need to covet. That is Paradigm. * Few people outside the company know just how widespread the company is. Paradigm is like a cancer with foul growths quietly growing through healthy flesh until the host dies. * It has vast resources, but the need for secrecy creates limits of how those resources can be used. !Working for Paradigm * Outwardly, Paradigm is a nice place to work. Good benefits, good pay, holiday gifts, suggestion boxes, etc.. Except, sometimes people transfer out of state, never to be heard from again. No retirees ever come back to visit. People who have been around long enough know not to make waves or risk their jobs ... or worse. Better to lay low. * Friendships are discouraged. Personalizing items are not allowed in the workplace 'to keep things professional'. * Family life is your own problem. Work comes first. !Management * The CEO * The Board of Directors * Who runs Paradigm? Supposedly the CEO, but the CEO is not there to run the show; the CEO is there to take the blame when something goes wrong. For this, they are paid exceptionally handsomely when they are forced to 'resign'. The Board of Directors is equally expendable, but for different reasons. Board members are replaced when the stockholders feel the company is not making enough money. * Fortunately, Paradigm spends half of its energy fighting itself. Corrupt, egotistical, power-mongers don't work well together. Back-stabbing, hidden agendas, and subversion are daily activities at the top. !History * Paradigm started in 1865 when Jeremiah Lassater founded Standard Oil. He was a ruthless, opportunist even before the accident. In 1869, while inspecting a problematic drilling site, Lassater became trapped in a tunnel with a fearsome [Bane]. In exchange for his life, he allowed the [Bane] to act through him, and so began the company's long, dark descent." :titles "Pentex" :rulemap (rulemap "Ad Infinitum" (rule :name "Ad Infinitum" :image "Units/ModernFantasy/AdInfinitum.jpg" :summary "* Advertising and Marketing * Television * Communications") "Chrysalis Corporation" (rule :name "Chrysalis Corporation" :image "Units/ModernFantasy/ChyrsalisCorporation.jpg" :summary "* The Price of Beauty * Fashion, Beauty, Hygiene, Self Help, and Diet products * Rising Stars - Chrysalis sponsors a talent agency searching for desparate artists and actors that either can't find their big break or have already used up their 15 minutes of fame. Rising Stars has a good reputation since they give unknowns and has-beens a chance. Of course, they are actually interested in guiding them down a degrading series of lies, drugs, whoring, pornography and other exploitations. In these positions, they earn money and provide a useful spy network for Chrysalis. When they are too old to be of use Chrysalis can always find some use for their bodies. * A New You - This popular diet and exercise program secretly encourages vain and narcissistic tendencies. As the customer becomes stronger and more beautiful, he/she also starts losing friends. But, of course, A New You provides all the friends you might want... * Homogeniety - Chrysalis sponsors a social group dedicated to curing homosexuality. Through them it attracts the despondent and the outcast. Those filled with self doubt are easily duped into undergoing treatments that will make them more Normal. Homogenity is run by Pastor Jim Fowler who despite claiming to be cured of homosexuality, instead preys on youths under his care. If they reject him, he simply claims that they have passed a 'test'.") "Cyberdyne Systems" (rule :name "Cyberdyne Systems" :image "Units/ModernFantasy/Cyberdyne.jpg" :summary "* Cyberdyne is a leading manufacturer of computers, software, microchips, and robotics. * Massively Multiplayer Games - Cyberdyne secretly maintains a presense on many online game sites. Here they cultivate and recruit 'like-minded' players into the corporate fold. Many hackers, dangerous malcontents, and even terrorists have been duped into doing Cyberdyne's dirty work for them.") "Omni Comsume Products (OCP)" (rule :name "Omni Comsume Products (OCP)" :image "Units/ModernFantasy/OmniComsumerProducts.jpg" :reference "The Only Choice - Robocop") "Shinra Electric" (rule :name "Shinra Electric" :image "Units/ModernFantasy/ShinraElectric.jpg" :reference "* A nuclear meltdown, contrary to popular belief, does not involve nuclear material escaping from the cooling towers to spatter the area in nuclear waste. The reality is much worse. * When a fission reactor overheats sufficiently, it will literally 'melt down' through the floor. The core is so dense, that it will keep sinking until it hits bedrock, usually in the water table. * What happens next is nightmarish. The water becomes tainted with radioactivity and flows into wells, streams, rivers, and reserviors. It can poison tens of thousands of square miles in a frighteningly short time. * Worst of all, once a core melts down, it cannot be removed. It will continue pouring out radioactive water until the pile decays which can be a VERY long time indeed. * The Corcord 1 and 2 plants in New Hampshire sit astride the Connecticut River which flows between Vermont and New Hampshire, across Massachusetts, through Hartford and down to the Long Island Sound. This whole area would be poisoned in a meltdown not to mention the slow contamination of the body of water that touches New York City and the Atlantic Ocean." :summary "* Shinra is an electricity provider. Besides power lines, that means Coal and Nuclear.") "Standard Oil" (rule :name "Standard Oil" :image "Units/ModernFantasy/StandardOil.jpg" :reference "* So if I allow your employer to set up operations, they will build six hospitals and provide vaccines for two hundred thousand children living in poverty? What's the catch? We do have something of a corporate conscience, and it bothered our executives to think of all of the poverty and disease and suffering that would be within, well, spitting distance of the site...and if you should refuse this offer, we will make certain that every man, woman, and child in this fleabag of a country knows that you and you alone were responsible for turning down all those hospitals and medicines and jobs. - Regional Negotiations" :summary "* Standard is an international Oil and Petroleum product manufacturer including exploration, drilling, refining, trucking, shipping, gas stations, convenience stores, etc. * Every so often, Standard sponsors something on PBS to make itself known as a 'good corporate citizen', but in general, there is nothing to distinguish the company in the public mind from any other big corporation. Some see this as an advertising failure, but Standard considers this to be camouflage. * 'The cost of the fine is always less than the cost of compliance.' - Corporate policy is very simple: Make as much money as possible, as quickly as possible, with as little overhead as possible. This hell-bent-for-leather profitability grab makes the stockholders happy, though 'as little overhead as possible' translates to as few environmental and safety safeguards as possible. It also means as little maintenance on its tanker fleet as possible. * Of course they can't ignore environmental concerns completely, but they prefer to invest in ad campaigns that equate protecting the environment with lost jobs. Meanwhile, it makes high-profile, low content gestures toward responsibility to maintain the smokescreen. * In the Third World, Standard is especially powerful. They bribe or blackmail local governments to allow them to essentially establish independent fiefdoms complete with private armies. * Oil companys must always produce more oil, so Standard's research and exploration teams are well paid to find the oil WHEREEVER it lies. Oil doesn't respect national borders or religious sites, so neither do they.") "Tyrell Corporation" (rule :name "Tyrell Corporation" :image "Units/ModernFantasy/TyrellCorporation.jpg" :reference "* More Human Than Human - Blade Runner") "Umbrella Pharmaceutical" (rule :name "Umbrella Pharmaceutical" :image "Units/ModernFantasy/UmbrellaCorporation.jpg" :reference "* Our Business is Life Itself - Resident Evil * Regenerate's revolutionary T-Cell formula actually brings dead cells ... back to life. Now your youthful beauty can last ... forever. Always consult your doctor before starting treatment. Some side-effects can occur." :summary "* Pharmaceuticals * Conception Clinics - Umbrella sponsors fertility clinics and sperm banks. They take full advantage of the genetic material they receive and have been known to provide sperm of questionable origins to further their experimentation. They have councilors on staff to help the distraught mothers who for some reason feel that they have something unnatural inside them.") "United Fruit" (rule :name "United Fruit" :image "Units/ModernFantasy/UnitedFruit.jpg" :reference "* United Fruit had a deep and long-lasting impact in the economic and political development of several Latin American countries. Critics often accused it of exploitative neocolonialism and described it as the archetypal example of the influence of a multinational corporation on the internal politics of the so-called 'banana republics.' United Fruit became part of the present-day Chiquita Brands International.") :Weyland-Yutani (rule :name "Weyland-Yutani" :image "Units/ModernFantasy/WeylandYutani.jpg" :reference "* Building Better Worlds - Alien * Halliburton" :summary "* The Company is a manufacturing and construction firm known for innumerable no-bid public works projects for municipal governments and the military." :titles "The Company") "Yoyodyne Propulsion" (rule :name "Yoyodyne Propulsion" :image "Units/ModernFantasy/Yoyodyne.jpg" :reference "* Where the future begins tomorrow - Buckaroo Banzai * Numerous props in Star Trek series indicate that parts of Federation starships were manufactured by Yoyodyne Propulsion Systems or YPS. The creators of Star Trek: The Next Generation were noted fans of Buckaroo Banzai and featured many references to the film in the series." :summary "* Defense contractor"))))))))
nx/tactics/books/prehistory
Description:
Package Name:
  • nx/tactics/books/prehistory
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
Functions:
  • tacticsbook
Source Code:
  • (package nx/tactics/books/prehistory :libs (lib base :path nx/tactics/base)) (func tacticsbook : base/book (book :name "Prehistory" :chaptermap (chaptermap "Prehistory Overview" (chapter :name "Prehistory Overview" :sectionmap (sectionmap "Why Tactics: Prehistory?" (section :name "Why Tactics: Prehistory?"))) "Prehistoric Creatures" (chapter :name "Prehistoric Creatures" :sectionmap (sectionmap "Primitive Man" (section :name "Primitive Man" :unitmap (unitmap :Hunter/Gatherer (unit :name "Hunter/Gatherer"))))))))
nx/tactics/books/prehistory / tacticsbook
Description:
Function Name:
  • tacticsbook
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func tacticsbook : base/book (book :name "Prehistory" :chaptermap (chaptermap "Prehistory Overview" (chapter :name "Prehistory Overview" :sectionmap (sectionmap "Why Tactics: Prehistory?" (section :name "Why Tactics: Prehistory?"))) "Prehistoric Creatures" (chapter :name "Prehistoric Creatures" :sectionmap (sectionmap "Primitive Man" (section :name "Primitive Man" :unitmap (unitmap :Hunter/Gatherer (unit :name "Hunter/Gatherer"))))))))
nx/tactics/books/pulp_fiction
Description:
Package Name:
  • nx/tactics/books/pulp_fiction
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
Functions:
  • tacticsbook
Source Code:
  • (package nx/tactics/books/pulp_fiction :libs (lib base :path nx/tactics/base)) (func tacticsbook : base/book (book :name "Pulp Fiction" :chaptermap (chaptermap "Pulp Fiction Overview" (chapter :name "Pulp Fiction Overview" :sectionmap (sectionmap "Why Tactics: Pulp Fiction?" (section :name "Why Tactics: Pulp Fiction?"))) :Action/Adventure (chapter :name "Action/Adventure" :sectionmap (sectionmap "Treasure Hunters" (section :name "Treasure Hunters" :unitmap (unitmap "Indiana Jones" (unit :name "Indiana Jones" :image "PulpFiction/IndianaJones.png" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee" :unititemmap (unititemmap :Bullwhip (unititem :name "Bullwhip"))) :Firearms (unitskill :name "Firearms") :Knowledge (unitskill :name "Knowledge" :unitabilitymap (unitabilitymap :Antiquities (unitability :name "Antiquities") :Archeology (unitability :name "Archeology") "Ancient History" (unitability :name "Ancient History") "Religious Studies" (unitability :name "Religious Studies"))))) "Lara Croft" (unit :name "Lara Croft" :image "PulpFiction/LaraCroft.png" :unitskillmap (unitskillmap :Firearms (unitskill :name "Firearms") :Influence (unitskill :name "Influence"))))))) "Flash Gordon" (chapter :name "Flash Gordon") "Hardboiled Detective" (chapter :name "Hardboiled Detective") "John Carter on Mars" (chapter :name "John Carter on Mars") "Land of the Lost" (chapter :name "Land of the Lost" :sectionmap (sectionmap "Land of the Lost Units" (section :name "Land of the Lost Units" :unitmap (unitmap :Pylon (unit :name "Pylon") :Skylon (unit :name "Skylon") :Enik (unit :name "Enik") :Pakuni (unit :name "Pakuni") :Sleestak (unit :name "Sleestak"))))) "Lost Continent" (chapter :name "Lost Continent") "True Grit / Crime" (chapter :name "True Grit / Crime") "War of the Worlds" (chapter :name "War of the Worlds"))))
nx/tactics/books/pulp_fiction / tacticsbook
Description:
Function Name:
  • tacticsbook
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func tacticsbook : base/book (book :name "Pulp Fiction" :chaptermap (chaptermap "Pulp Fiction Overview" (chapter :name "Pulp Fiction Overview" :sectionmap (sectionmap "Why Tactics: Pulp Fiction?" (section :name "Why Tactics: Pulp Fiction?"))) :Action/Adventure (chapter :name "Action/Adventure" :sectionmap (sectionmap "Treasure Hunters" (section :name "Treasure Hunters" :unitmap (unitmap "Indiana Jones" (unit :name "Indiana Jones" :image "PulpFiction/IndianaJones.png" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee" :unititemmap (unititemmap :Bullwhip (unititem :name "Bullwhip"))) :Firearms (unitskill :name "Firearms") :Knowledge (unitskill :name "Knowledge" :unitabilitymap (unitabilitymap :Antiquities (unitability :name "Antiquities") :Archeology (unitability :name "Archeology") "Ancient History" (unitability :name "Ancient History") "Religious Studies" (unitability :name "Religious Studies"))))) "Lara Croft" (unit :name "Lara Croft" :image "PulpFiction/LaraCroft.png" :unitskillmap (unitskillmap :Firearms (unitskill :name "Firearms") :Influence (unitskill :name "Influence"))))))) "Flash Gordon" (chapter :name "Flash Gordon") "Hardboiled Detective" (chapter :name "Hardboiled Detective") "John Carter on Mars" (chapter :name "John Carter on Mars") "Land of the Lost" (chapter :name "Land of the Lost" :sectionmap (sectionmap "Land of the Lost Units" (section :name "Land of the Lost Units" :unitmap (unitmap :Pylon (unit :name "Pylon") :Skylon (unit :name "Skylon") :Enik (unit :name "Enik") :Pakuni (unit :name "Pakuni") :Sleestak (unit :name "Sleestak"))))) "Lost Continent" (chapter :name "Lost Continent") "True Grit / Crime" (chapter :name "True Grit / Crime") "War of the Worlds" (chapter :name "War of the Worlds"))))
nx/tactics/books/science_fiction
Description:
Package Name:
  • nx/tactics/books/science_fiction
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
Functions:
  • tacticsbook
Source Code:
  • (package nx/tactics/books/science_fiction :libs (lib base :path nx/tactics/base)) (func tacticsbook : base/book (book :name "Science Fiction" :image "Future.jpg" :chaptermap (chaptermap "Science Fiction Overview" (chapter :name "Science Fiction Overview" :reference "http://www.merzo.net/index.html" :sectionmap (sectionmap "Distant Future Space Warfare" (section :name "Distant Future Space Warfare" :summary "* Shields * Ion Cannons * Disruptors * Disintegrators * Transporters * Hyperdrive * Jumpdrive * Railguns * Boarding Parties * Starfighters * Starbombers * Mobile Suits * Mobile Armor * Large Starships * Small Starships * Nuclear Weapons * Starbases"))) :Archetypes (chapter :name "Archetypes" :summary "* Psionic ** Preferred Skills: [Telepathy], [Mind Over Matter], [Divination]") "Alternate Realties" (chapter :name "Alternate Realties" :sectionmap (sectionmap "Time in a Bottle" (section :name "Time in a Bottle" :reference "* If I could save time in a bottle, the first that I'd like to do, is to save every day 'til eternity passes away, just to spend them with you. - Time in a bottle, Jim Croce" :summary "* A temporal paradox has trapped the entire Earth in a time loop. For about a month, the people of the planet relive the same week over and over. They remember each loop but the longer they stay in the loop the more likely they are to be compelled to repeat the same events each time. Those who suffer or die during the period know they will repeat their actions but are largely powerless to stop themselves. The experience would eventually drive them insane if their minds could change that much. * Time travelers who arrive are immediately recognized by everyone as being different from the previous events. The locals are tremendously thankful that they can react differently since the travelers weren't in the previous time loops. This will be short lived, however, because once the loop resets the time travelers will be part of the loop, and each time the loop resets it will become harder for everyone to act differently again. If the travelers don't sort out this problem, they will be trapped here forever."))) "Alien / Predator" (chapter :name "Alien / Predator" :image "AlienPredator/AlienPredator.jpg" :sectionmap (sectionmap :Humans (section :name "Humans" :unitmap (unitmap "Company Man" (unit :name "Company Man" :reference "* I work for the company. But don't let that fool you, I'm really an okay guy. - Burke, Aliens * This installation has a substantial dollar value attached to it. They can bill me. - Burke and Ripley, Aliens * If I went and made a major security situation out of it, everybody steps in; Administration steps in, and there's no exclusive rights for anybody, nobody wins! So I made a decision, and it was... wrong. It was a bad call, Ripley. It was a bad call. - Burke, Aliens") :Civilian (unit :name "Civilian") "Marine Grunt" (unit :name "Marine Grunt" :image "ColonialMarines/Marine.png" :reference "* These people are here to protect you. They're soldiers. It won't make any difference. - Ripley and Newt, Aliens * Is this gonna be a standup fight, sir, or another bughunt? - Hudson, Aliens * He can't make that kind of decision, he's just a grunt! Ah, no offense. None taken. - Burke and Hicks, Aliens" :summary "* Pulse Rifle * Shotgun") "Marine Heavy Weapons" (unit :name "Marine Heavy Weapons" :reference "* Look, man. I only need to know one thing: where they are. - Vasquez, Aliens") "Marine Lieutenant" (unit :name "Marine Lieutenant" :reference "* How many drops is this for you, Lieutenant? Thirty eight... simulated. How many *combat* drops? Uh, two. Including this one. - Vasquez and Gorman, Aliens") "Marine Pilot" (unit :name "Marine Pilot" :reference "* We're in the pipe, five by five. - Ferro, Aliens") "Marine Sergeant" (unit :name "Marine Sergeant" :reference "* Another glorious day in the Corps! A day in the Corps is like a day on the farm. Every meal's a banquet! Every paycheck a fortune! Every formation a parade! I LOVE the Corps! - Apone, Aliens") "Marine Tech" (unit :name "Marine Tech" :summary "* Motion Detector * Electronics Pack") "Power Loader" (unit :name "Power Loader" :image "ColonialMarines/PowerLoader.png") "Sentry Turret" (unit :name "Sentry Turret" :image "ColonialMarines/SentryTurret.png") :Synthetic (unit :name "Synthetic" :image "ColonialMarines/Android.png" :reference "* Bring back life form. Priority One. All other priorities rescinded. The damn company. What about our lives, you son of a bitch? I repeat, all other priorities are rescinded. - Ash and Parker, Alien * I admire its purity. A survivor... unclouded by conscience, remorse, or delusions of morality. - Ash, Alien * I prefer the term 'Artificial Person' myself. - Bishop, Aliens * Not bad for a human. - Bishop, Aliens * Ripley's last trip out, the syn- the artificial person malfunctioned. Malfuctioned? There were problems and a-a few deaths were involved. - Burke and Bishop, Aliens" :titles "Syn (derogatory)"))))) "Battlestar Galactica" (chapter :name "Battlestar Galactica" :sectionmap (sectionmap :Cylons (section :name "Cylons" :unitmap (unitmap "Cylon 6" (unit :name "Cylon 6" :image "BattlestarGalactica/Cylon_6.png") "Cylon Centurion" (unit :name "Cylon Centurion" :image "BattlestarGalactica/Cylon_Centurion.png") "Cylon Raider" (unit :name "Cylon Raider" :image "BattlestarGalactica/Cylon_Raider.png") "Cylon Base Star" (unit :name "Cylon Base Star" :image "BattlestarGalactica/Cylon_BaseStar.png"))))) "Doctor Who" (chapter :name "Doctor Who" :sectionmap (sectionmap "Doctor Who Units" (section :name "Doctor Who Units" :unitmap (unitmap "Amy Pond" (unit :name "Amy Pond") "Captain Jack Harkness" (unit :name "Captain Jack Harkness" :image "DrWho/CaptainJackHarkness.png" :unitpowermap (unitpowermap :Longevity (unitpower :name "Longevity" :unitabilitymap (unitabilitymap "Eternal Youth" (unitability :name "Eternal Youth") "True Immortality" (unitability :name "True Immortality"))))) "Clara Oswald" (unit :name "Clara Oswald" :reference "* Clara: Have we just watched the entire life cycle of Earth, birth to death. Doctor: Yes. Clara: And you're okay with that? Doctor: ... Yes. Clara: How can you be? ... To you, I haven't been born yet, and to you I've been dead a hundred billion years. Is my body out there somewhere, in the ground? Doctor: ... Yes... I suppose it is. Clara: But hear we are talking, so I am a ghost. To you, I'm a ghost. We're all ghost to you. We must be nothing. Doctor: No, no. You're not that. Never that. Clara: They what are we? What can we possible be? Doctor: You are the only mystery, worth solving.") :Cyberman (unit :name "Cyberman" :image "DrWho/Cyberman.png" :reference "We have 5 million Cybermen. How many are you? Four! You would destroy the Cybermen with 4 Daleks? We would destroy the Cybermen with 1 Dalek! You are superior to us in only one respect. You are better at dying! - Cybermen and Daleks") :Dalek (unit :name "Dalek" :image "DrWho/Dalek.png" :reference "Imagine you were dying. Imagine you were afraid and a long way from home and in terrible pain. And just when you thought it couldn't get worse, you looked up and saw the face of the devil himself. Hello Dalek - The Doctor" :summary "The Daleks odd form may be explained by their personal shielding. Weapons and sensors are placed on stalks so that they may protrude from the shield. This prevents their shield from interfering with their equipment, but it also leaves these devices vulnerable." :unitpowermap (unitpowermap :Armor (unitpower :name "Armor") :Shielding (unitpower :name "Shielding"))) :Davros (unit :name "Davros" :image "DrWho/Davros.png" :reference "* To hold in my hand a capsule that contained such power...To know that the tiny pressure of my thumb, enough to break the glass would end...everything...Yes...I WOULD do it. Such power would put me above the Gods! - Davros * Across the entire universe, never stopping, never faltering, never fading. People, planets, and stars will become dust, and the dust will become atoms, and the atoms will become...nothing. Into every dimension, every parallel, every single corner of creation. This is my ultimate victory, Doctor: the destruction of reality... itself! - Davros * The man who abhors violence, never carrying a gun. But this is the truth Doctor, you take ordinary people and fashion them into weapons...How many more? Just think how many have died in your name...The Doctor, the man who keeps running, never looking back because he dare not out of shame. This is my final victory, Doctor. I have shown you...yourself. - Davros") "Doctor, The" (unit :name "Doctor, The" :image "DrWho/TheDoctor.png" :reference "* Who are you? ... The ground beneath our feet spinning at a 1000 miles an hour, and the entire planet is hurtling around the sun at 67,000 miles an hour, and I can feel it. We're falling through space, you and me, clinging to the skin of this tiny little world, and if we let go ... That's who I am. Now forget me. - Rose and The Doctor * Oh, I'll think of something. You're just making this up as you go along. Yup...but I do it brilliantly - The Doctor * I've seen him. He's like fire and ice and rage. He's like the night and the storm and the heart of the sun. He's ancient and forever. He burns at the center of time and he can see the turn of the universe. * Is this world protected? You're not the first lot to have come here. Oh, there have been so many. And what you've got to ask is...what happened to them? Hello, I'm the Doctor. Basically...run. - The Doctor * Everyone's got memories of a holiday they couldn't have be to, or a party they never went to, or met someone for the first time and felt like they've know them all their lives. Time is being rewritten all around us, everyday. People think their memories are bad, but their memories are fine. The past is really like that. - The Doctor * There are laws of time and once upon a time, there were people in charge of those laws, but died. They all died. They all died. And you know who that leaves. Me! It has taken me all these years to realize, the laws of time are mine. And they will obey me! ... The whole of history could change...the future of the human race. No one should have that much power. Tough. ... For a long time I thought I was just a survivor, but I'm not. I'm the winner. That's who I am. The Time Lord Victorious. And there is no one to stop you. No. This is wrong, Doctor. I don't care who you are. The Time Lord Victorious is wrong! That's for me to decide. ... Is there nothing you can't do? Not anymore. - Captain Aldelede and The Doctor * Silence will fall when the question is asked...The first question, the question that must never be answered, hidden in plain sight, the question you've been running from all your life...Doctor WHO? * If I run away today. Good people will die. If I stand and fight, some of them might live. Maybe not many. Maybe not for long. Hey, maybe there's no point in any of this at all, but its the best I can do. So, I'm going to do it, and I will stand here doing it until it kills em. You're going to die too. Someday. What would that be? Have you thought of that? Would you die for? Who I am is where I stand. Where I stand... is where I fall. Stand with me. - Doctor and Masters. * People always get it wrong with Time Lords. We take forever to die. Even if we are too injured to regenerate, every cell in our bodies keeps trying. Dying properly can take days. That's why we like to die among our own kind. They know not to bury us early. I think... In my current condition, it'll take me about... a day and a half to reach the top of the tower. I think, if I'm lucky, I have a day and a half. - Heaven Sent") :K-9 (unit :name "K-9" :image "DrWho/K9.png" :reference "The Doctor likes traveling with an entourage. Sometimes they're human, sometimes they're aliens and sometimes they're tin dogs. What about you? Where do you fit in the picture? Me? I'm their man in Havana. I'm their technical support. I'm... Oh my god. I'm the tin dog! - Sarah Jane Smith and Mickey Smith") "Martha Jones" (unit :name "Martha Jones" :image "DrWho/MarthaJones.png" :reference "She completely adored him ... Is this going anywhere? Yes. Cause he never looked at her twice ... and she wasted years of her life ... and I told her time and time again. Get out. So this is me getting out. - Martha Jones and the Doctor") "Master, The" (unit :name "Master, The" :image "DrWho/TheMaster.png" :reference "* We stand there... 8 years old... staring at the raw power of time and space, just a child. Some would be inspired... Some would run away ... and some would go mad. What about you? Oh, the one who ran away. I never stopped. - The Doctor and Martha * And so it came to pass, that the human race fell and the Earth was no more. And I looked out on my new Dominion as master of all and I thought it good.") "Rose Tyler" (unit :name "Rose Tyler" :image "DrWho/RoseTyler.png" :reference "This is really seeing the future - you just leave us behind! ... Sarah Jane - you were that close to her once, and now ... you never even mention her. ... I don't age. I regenerate. But humans decay. You wither and you die. Imagine watching that happen to someone you ... You can spend the rest of your life with me. But I can't spend the rest of mine with you. I have to live on, alone. That's the curse of the Timelords. - Rose and the Doctor, Doctor Who") "Sarah Jane Smith" (unit :name "Sarah Jane Smith" :image "DrWho/SarahJaneSmith.png" :reference "The universe has to move forward. Pain and loss, they define us as much as happiness or love. Whether it's a world, or a relationship ... Everything has its time. And everything ends. - Sarah Jane Smith") :Rutan (unit :name "Rutan" :image "DrWho/Rutan.png") :Sontaran (unit :name "Sontaran" :image "DrWho/Sontaran.png") "Sontaran Scout Ship" (unit :name "Sontaran Scout Ship" :image "DrWho/SontaranScoutShip.png") :Sutekh (unit :name "Sutekh" :reference "* You would use your powers for evil. Evil? Your evil is my good. I am Sutehk the Destroyer. Where I tread, I leave nothing but dust and darkness. I find that good. - The Doctor and Sutekh" :titles "Sutekh the Destroyer") "Weeping Angel" (unit :name "Weeping Angel"))))) :Robotech (chapter :name "Robotech" :sectionmap (sectionmap :Zentradi (section :name "Zentradi"))) "Space Cruiser Yamato" (chapter :name "Space Cruiser Yamato" :summary "Aka Starblazers" :sectionmap (sectionmap "Comet Empire" (section :name "Comet Empire" :unitmap (unitmap "Prince Zordar" (unit :name "Prince Zordar" :image "SpaceBattleshipYamato/PrinceZordar.png" :summary "I hold the whole universe in the palm of my hand. I just close my hand and planet crumble, the stars shatter! What chance does your planet Earth have? It's a cosmic joke. - Prince Zordar") "Comet Empire" (unit :name "Comet Empire" :image "SpaceBattleshipYamato/CometEmpire.png") :Medaruhse (unit :name "Medaruhse" :summary "Its principal weapon is a large plasma cannon which fires directly into a SMITE field which teleports the energy to a considerable distance. This gives the weapon a tremendous firing range more than twice that of a Wave Motion Gun." :titles "Magna Flame Gun" :unitpowermap (unitpowermap :Armor (unitpower :name "Armor")) :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :level "5" :unititemmap (unititemmap "Magna Flame Gun" (unititem :name "Magna Flame Gun"))))))))) "Space Opera" (chapter :name "Space Opera" :sectionmap (sectionmap "Interstellar Vehicles" (section :name "Interstellar Vehicles" :unitmap (unitmap "Islander Star Sloop" (unit :name "Islander Star Sloop" :summary "* The Islander is the smallest class merchant starship commonly available. It can carry 30tons of cargo, 4 low passage passengers, and 10 coldsleep bays. * 1x Light Particle Cannon * 6x Light Startorpedoes * The Islander has seen many modifications including high speed drives for courier or smuggling as well as heavier armaments." :mass "125tons") "Deep Space Probe" (unit :name "Deep Space Probe") "Corsair Star Privateer" (unit :name "Corsair Star Privateer" :summary "* The Starfarer is a small merchant starship designed for dangerous courier duty. As such, it has reduced cargo capacity and increased armor, and weapons. Its high firepower makes it popular among smugglers and pirates, though its high price means that few of these are procured through normal channels. * 50tons of cargo * 6 crew * 10 low passage passengers * 10 coldsleep bays. * 4x Medium Particle Cannon * 6x Light Startorpedoes * The Banner has seen many modifications including high speed drives for courier or smuggling as well as heavier armaments." :mass "250tons") "Valkyrie Patrol Star Cruiser" (unit :name "Valkyrie Patrol Star Cruiser" :summary "* The Valkyrie is a long range cruiser designed for planetary defense. * The Valkyrie acts as a mothership for up to 4 Nike class frigates that it carries and services. * 600tons cargo * 80 Crew * 60 low passage passengers * 20 coldsleep bays. * 8x Heavy Particle Cannon * 12x Light Particle Cannon * 6x Heavy Startorpedoes" :mass "12500tons") "Nike Patrol Space Frigate" (unit :name "Nike Patrol Space Frigate" :summary "* The Nike is a short range frigate designed for planetary defense. As a planetary defense ship it is highly maneuverable and carries a heavy weapons load for a small ship. * The Nike is transported longer distances by the larger Nemesis class. * 30tons cargo * 4 Low Passage passengers * 10 coldsleep bays. * 2x Medium Particle Cannon * 6x Light Particle Cannon * 6x Medium Startorpedoes * 10x Heavy Startorpedoes" :mass "375tons") "Oliphant Luxury Starliner" (unit :name "Oliphant Luxury Starliner" :summary "* 600 High Passage Accommations * 1200 Medium Passage Accommations * 2400 Low Passage Accommations * 1000 Coldsleep berths" :mass "75000tons") "Space Cutter" (unit :name "Space Cutter" :summary "* Larger than the Pinnacle, the Cutter can travel back and forth from a planet to its moon." :mass "60tons") "Space Lander" (unit :name "Space Lander" :summary "* Larger than the Cutter, the Lander can travel back and forth from a planet to its moon and is used to haul heavy equipment or passengers. In combat, the Lander is the prefered method to deploy infantry and tanks after a marine orbital halo drop." :mass "200tons") "Space Pinnacle" (unit :name "Space Pinnacle" :summary "* Larger than the Shuttlecraft, the Pinnacle can travel from orbit to a planet's moon and return." :mass "30tons") "Space Shuttlecraft" (unit :name "Space Shuttlecraft" :summary "* The shuttlecraft is the smallest of the ship's boats. It is capable of orbital travel to shuttle small complements of crew and cargo planetside." :titles "Launch" :mass "10tons") "Star Colony Ship" (unit :name "Star Colony Ship") "Sub-light Sleeper Ship - Ark" (unit :name "Sub-light Sleeper Ship - Ark") "Zephyr Startransport" (unit :name "Zephyr Startransport" :summary "* The Zephyr is a small merchant starship designed for comfortable passenger duty along major trade routs. As such, it has reduced cargo capacity and increased armor, and weapons. Its high firepower makes it popular among smugglers and pirates, though its high price means that few of these are procured through normal channels. * 75tons cargo * 6 crew * 10 Medium Passage Accommations * 30 Low Passage Accommations * 20 Coldsleep berths * 2x Light Particle Cannon * 6x Light Startorpedoes * The Banner has seen many modifications including high speed drives for courier or smuggling as well as heavier armaments." :mass "300tons"))))) "Star Trek" (chapter :name "Star Trek" :sectionmap (sectionmap "Alien Races" (section :name "Alien Races" :unitmap (unitmap "Borg Cube" (unit :name "Borg Cube" :image "StarTrek/Borg_Cube.png" :reference "We are the Borg. Lower your shields and surrender your ships. We will add your biological and technological distinctiveness to our own. Your culture will adapt to service us. Resistance is futile. - The Borg, Star Trek First Contact" :crew "130000" :mass "90Mtons" :length "3km" :unitpowermap (unitpowermap :Shielding (unitpower :name "Shielding" :summary "Adaptive Shielding total capacity 5,850,900TJ")) :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :summary "Total output 7,500,000TW" :level "4"))) "Borg Drone" (unit :name "Borg Drone" :image "StarTrek/Borg_Drone.png" :reference "The Borg were possibly created by the alien probe V'Ger to seek 'all that is knowable' and return to its creator.") "Doomsday Machine" (unit :name "Doomsday Machine" :image "StarTrek/DoomsdayMachine.png" :reference "Believed to have originated as an ancient race's last resort weapon against the Borg. Its basic design - destroy planets already assimilated by the Borg for use as fuel - coupled with an indestructible neutronium hull and antiproton beam (against which there was little or no defense), made it an ideal weapon against the Borg." :summary "* Maximum Speed: Warp 4 * Tractor Beam * Dampening Field * Can consume a planet in a day" :titles "Planet Killer" :classification "Hvy. Spacecraft" :mass "4x10^23tons" :length "2.7km" :unitpowermap (unitpowermap :Armor (unitpower :name "Armor" :summary "Solid Neutronium - Hyper Dense Neutron Star Material")) :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :level "4" :unititemmap (unititemmap "Anti-Proton Beam" (unititem :name "Anti-Proton Beam"))))) "Klingon Bird of Prey" (unit :name "Klingon Bird of Prey" :image "StarTrek/Klingon_BirdOfPrey.png" :unitpowermap (unitpowermap :Armor (unitpower :name "Armor") :Shielding (unitpower :name "Shielding") :Weaponry (unitpower :name "Weaponry" :unititemmap (unititemmap "Disruptor Bank" (unititem :name "Disruptor Bank") "Photon Torpedo" (unititem :name "Photon Torpedo"))) :Invisibility (unitpower :name "Invisibility" :unititemmap (unititemmap "Cloaking Device" (unititem :name "Cloaking Device")))) :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :level "4"))) "Klingon Cruiser" (unit :name "Klingon Cruiser" :image "StarTrek/Klingon_Cruiser.png" :unitpowermap (unitpowermap :Armor (unitpower :name "Armor") :Shielding (unitpower :name "Shielding") :Weaponry (unitpower :name "Weaponry" :unititemmap (unititemmap "Disruptor Bank" (unititem :name "Disruptor Bank") "Photon Torpedo" (unititem :name "Photon Torpedo")))) :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :level "5"))) "Klingon Warrior" (unit :name "Klingon Warrior" :image "StarTrek/Klingon_Warrior.png" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee"))) "Nomad Probe" (unit :name "Nomad Probe" :image "StarTrek/Nomad.png" :reference "* Error! Error!...Faulty! Faulty! Must sterilize imperfection! - STER-I-LIZE! - Nomad, Star Trek * Nomad - See the universe. Meet interesting people...and kill them. - Motivational Poster Parody") "Romulan Centurion" (unit :name "Romulan Centurion" :image "StarTrek/Romulan_Centurion.png") "Romulan Warbird" (unit :name "Romulan Warbird" :image "StarTrek/Romulan_Warbird.png" :unitpowermap (unitpowermap :Armor (unitpower :name "Armor") :Shielding (unitpower :name "Shielding")) :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :level "4" :unititemmap (unititemmap "Disruptor Bank" (unititem :name "Disruptor Bank") "Photon Torpedo" (unititem :name "Photon Torpedo"))))) "Species 8472" (unit :name "Species 8472" :image "StarTrek/Species8472.png") :V'Ger (unit :name "V'Ger" :image "StarTrek/VoyagerVI.png" :reference "Voyager VI - Tell Nomad I'm going to kick his ass. - Motivational Poster Parody" :titles "Voyager VI" :length "98km"))))) "Star Wars" (chapter :name "Star Wars" :sectionmap (sectionmap :Rebels (section :name "Rebels" :unitmap (unitmap :Chewbacca (unit :name "Chewbacca" :image "StarWars/Rebel_Chewbacca.png" :unitskillmap (unitskillmap :Firearms (unitskill :name "Firearms" :level "4" :unititemmap (unititemmap "Blaster Rifle" (unititem :name "Blaster Rifle"))) :Piloting (unitskill :name "Piloting" :level "5"))) "Han Solo" (unit :name "Han Solo" :image "StarWars/Rebel_HanSolo.png" :reference "I ain't in this for your revolution, and I'm not in it for you, Princess. I expect to be well paid. *I'm* in it for the money. - Han Solo, Star Wars" :unitskillmap (unitskillmap :Firearms (unitskill :name "Firearms" :level "5" :unititemmap (unititemmap "Blaster Pistol" (unititem :name "Blaster Pistol"))) :Piloting (unitskill :name "Piloting" :level "8"))) "Luke Skywalker" (unit :name "Luke Skywalker" :image "StarWars/Rebel_LukeSkywalker.png" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee" :level "7" :unititemmap (unititemmap :Lightsaber (unititem :name "Lightsaber"))) :Firearms (unitskill :name "Firearms" :level "3" :unititemmap (unititemmap "Blaster Pistol" (unititem :name "Blaster Pistol"))) :Piloting (unitskill :name "Piloting" :level "6"))) "Ben Kenobi" (unit :name "Ben Kenobi" :image "StarWars/Rebel_BenKenobi.png" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee" :level "8" :unititemmap (unititemmap :Lightsaber (unititem :name "Lightsaber"))) :Piloting (unitskill :name "Piloting" :level "6"))) "Princess Leia Organa" (unit :name "Princess Leia Organa" :image "StarWars/Rebel_PrincessLeia.png" :reference "* Someone has to save our skins. Into the garbage chute, fly boy - Princess Leia, Star Wars" :unitskillmap (unitskillmap :Firearms (unitskill :name "Firearms" :level "5" :unititemmap (unititemmap "Blaster Pistol" (unititem :name "Blaster Pistol"))))) :Yoda (unit :name "Yoda" :image "StarWars/Yoda.png" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee" :level "10" :unititemmap (unititemmap :Lightsaber (unititem :name "Lightsaber"))))))))) "Time Travellers" (chapter :name "Time Travellers" :reference "* Doctor: People don't understand time. It's not what you think it is. Sally: Then what is it? Doctor: Complicated. Sally: Tell me. Doctor: Very complicated. ... Doctor: People assume that time is strict progression of cause of cause to effect, but actually from a non-linear, non-subjective viewpoint, its more like a big ball of wibbly-wobbly, timey-wimey stuff... Sally Sparrow, Doctor - Blink - Doctor Who" :sectionmap (sectionmap "Temporal Vehicles" (section :name "Temporal Vehicles" :unitmap (unitmap "Time Rotor" (unit :name "Time Rotor" :image "DistantFuture/TimeRotor.jpg" :reference "* Eternal Sunshine of the Spotless Mind * Flatliners * Vortex in Doctor Who credits * Time Stranger Anime * Time Travel in Terminator Series" :summary "* Description - The Temporal Rotor is an amazing device created by a vanished civilization. It is mostly a communication device that can reach into the Temporal Vortex and communicate with the central computer Chronos on the asteroid Babylon. Chronos harnesses the black hole hidden within Bablyon to move the Time Rotor and its operator through time and space. It is perhaps the most powerful device ever created. * Activating the Temporal Rotor - When the Temporal Rotor is activated, static electricity begins to build in the area. At full strength the static is dangerous, so travellers should not move to avoid discharge. A glowing field begins to form. Travellers heart rate begins to climb and they have a sudden feeling of intense, unnatural danger and imminent death. Hearts begin to fibrilate and flatline. * Entering the Vortex - The travellers blink and become aware that they are in the Vortex. Further, they recognize that they have always been in the Vortex. Every moment of their life remembered as if it just occurred. Only their future remains unseen. Time in the Vortex has no meaning, so travellers may leave immediately or stay for an eternity before moving on. * Leaving the Vortex - Leaving is just as traumatic as entering. As the Temporal Rotor slows, the travellers begin to forget all that they have just remembered. It is like losing one's mind bit by bit. They feel torn apart and incomplete. Soon they start losing coherent thought, their minds becoming simple and primal. Their senses and desires become simple: Food, Sex, Fear, Violence, Warmth ... Food, Fear, Violence, Warmth ... Food, Warmth ... Warmth. All is dark, wet, and warm as it has always been. Soft, pink bubbles surround and comfort you. You have no wants. You are complete. Suddenly a bright light blinds you, and happiness and security are torn from you. And there is pain, pain where there never was pain before. Waves of burning pain crush you, chew you up, and spit you out. You lie on the ground, cold and in shock. A new pressure builds in your chest, and without thinking you gasp and take in your first breath. Your eyes open to see the last lights on the Temporal Rotor wink out. You are coverered in a heavy, red jelly like congealed blood. The jelly quickly dries to dust and disappears. You rise and feel healthier than ever before. Old wounds and scars are gone as if they never were, and you are different: your skin, your teeth, your hair, your language all are as if you were born and lived your life in this time and place. Your equipment is gone and your clothes have been replaced with simple native garb: a gift from Chronos." :height "1.5m" :width ".2m") :Timefighter (unit :name "Timefighter"))))) "Unique Aliens" (chapter :name "Unique Aliens" :sectionmap (sectionmap "Alien Life Forms" (section :name "Alien Life Forms" :unitmap (unitmap :Arachnid (unit :name "Arachnid" :reference "Starship Troopers" :titles "Bug") :Blob (unit :name "Blob") "Puppet Master" (unit :name "Puppet Master") "Thing from another World" (unit :name "Thing from another World"))))))))
nx/tactics/books/science_fiction / tacticsbook
Description:
Function Name:
  • tacticsbook
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func tacticsbook : base/book (book :name "Science Fiction" :image "Future.jpg" :chaptermap (chaptermap "Science Fiction Overview" (chapter :name "Science Fiction Overview" :reference "http://www.merzo.net/index.html" :sectionmap (sectionmap "Distant Future Space Warfare" (section :name "Distant Future Space Warfare" :summary "* Shields * Ion Cannons * Disruptors * Disintegrators * Transporters * Hyperdrive * Jumpdrive * Railguns * Boarding Parties * Starfighters * Starbombers * Mobile Suits * Mobile Armor * Large Starships * Small Starships * Nuclear Weapons * Starbases"))) :Archetypes (chapter :name "Archetypes" :summary "* Psionic ** Preferred Skills: [Telepathy], [Mind Over Matter], [Divination]") "Alternate Realties" (chapter :name "Alternate Realties" :sectionmap (sectionmap "Time in a Bottle" (section :name "Time in a Bottle" :reference "* If I could save time in a bottle, the first that I'd like to do, is to save every day 'til eternity passes away, just to spend them with you. - Time in a bottle, Jim Croce" :summary "* A temporal paradox has trapped the entire Earth in a time loop. For about a month, the people of the planet relive the same week over and over. They remember each loop but the longer they stay in the loop the more likely they are to be compelled to repeat the same events each time. Those who suffer or die during the period know they will repeat their actions but are largely powerless to stop themselves. The experience would eventually drive them insane if their minds could change that much. * Time travelers who arrive are immediately recognized by everyone as being different from the previous events. The locals are tremendously thankful that they can react differently since the travelers weren't in the previous time loops. This will be short lived, however, because once the loop resets the time travelers will be part of the loop, and each time the loop resets it will become harder for everyone to act differently again. If the travelers don't sort out this problem, they will be trapped here forever."))) "Alien / Predator" (chapter :name "Alien / Predator" :image "AlienPredator/AlienPredator.jpg" :sectionmap (sectionmap :Humans (section :name "Humans" :unitmap (unitmap "Company Man" (unit :name "Company Man" :reference "* I work for the company. But don't let that fool you, I'm really an okay guy. - Burke, Aliens * This installation has a substantial dollar value attached to it. They can bill me. - Burke and Ripley, Aliens * If I went and made a major security situation out of it, everybody steps in; Administration steps in, and there's no exclusive rights for anybody, nobody wins! So I made a decision, and it was... wrong. It was a bad call, Ripley. It was a bad call. - Burke, Aliens") :Civilian (unit :name "Civilian") "Marine Grunt" (unit :name "Marine Grunt" :image "ColonialMarines/Marine.png" :reference "* These people are here to protect you. They're soldiers. It won't make any difference. - Ripley and Newt, Aliens * Is this gonna be a standup fight, sir, or another bughunt? - Hudson, Aliens * He can't make that kind of decision, he's just a grunt! Ah, no offense. None taken. - Burke and Hicks, Aliens" :summary "* Pulse Rifle * Shotgun") "Marine Heavy Weapons" (unit :name "Marine Heavy Weapons" :reference "* Look, man. I only need to know one thing: where they are. - Vasquez, Aliens") "Marine Lieutenant" (unit :name "Marine Lieutenant" :reference "* How many drops is this for you, Lieutenant? Thirty eight... simulated. How many *combat* drops? Uh, two. Including this one. - Vasquez and Gorman, Aliens") "Marine Pilot" (unit :name "Marine Pilot" :reference "* We're in the pipe, five by five. - Ferro, Aliens") "Marine Sergeant" (unit :name "Marine Sergeant" :reference "* Another glorious day in the Corps! A day in the Corps is like a day on the farm. Every meal's a banquet! Every paycheck a fortune! Every formation a parade! I LOVE the Corps! - Apone, Aliens") "Marine Tech" (unit :name "Marine Tech" :summary "* Motion Detector * Electronics Pack") "Power Loader" (unit :name "Power Loader" :image "ColonialMarines/PowerLoader.png") "Sentry Turret" (unit :name "Sentry Turret" :image "ColonialMarines/SentryTurret.png") :Synthetic (unit :name "Synthetic" :image "ColonialMarines/Android.png" :reference "* Bring back life form. Priority One. All other priorities rescinded. The damn company. What about our lives, you son of a bitch? I repeat, all other priorities are rescinded. - Ash and Parker, Alien * I admire its purity. A survivor... unclouded by conscience, remorse, or delusions of morality. - Ash, Alien * I prefer the term 'Artificial Person' myself. - Bishop, Aliens * Not bad for a human. - Bishop, Aliens * Ripley's last trip out, the syn- the artificial person malfunctioned. Malfuctioned? There were problems and a-a few deaths were involved. - Burke and Bishop, Aliens" :titles "Syn (derogatory)"))))) "Battlestar Galactica" (chapter :name "Battlestar Galactica" :sectionmap (sectionmap :Cylons (section :name "Cylons" :unitmap (unitmap "Cylon 6" (unit :name "Cylon 6" :image "BattlestarGalactica/Cylon_6.png") "Cylon Centurion" (unit :name "Cylon Centurion" :image "BattlestarGalactica/Cylon_Centurion.png") "Cylon Raider" (unit :name "Cylon Raider" :image "BattlestarGalactica/Cylon_Raider.png") "Cylon Base Star" (unit :name "Cylon Base Star" :image "BattlestarGalactica/Cylon_BaseStar.png"))))) "Doctor Who" (chapter :name "Doctor Who" :sectionmap (sectionmap "Doctor Who Units" (section :name "Doctor Who Units" :unitmap (unitmap "Amy Pond" (unit :name "Amy Pond") "Captain Jack Harkness" (unit :name "Captain Jack Harkness" :image "DrWho/CaptainJackHarkness.png" :unitpowermap (unitpowermap :Longevity (unitpower :name "Longevity" :unitabilitymap (unitabilitymap "Eternal Youth" (unitability :name "Eternal Youth") "True Immortality" (unitability :name "True Immortality"))))) "Clara Oswald" (unit :name "Clara Oswald" :reference "* Clara: Have we just watched the entire life cycle of Earth, birth to death. Doctor: Yes. Clara: And you're okay with that? Doctor: ... Yes. Clara: How can you be? ... To you, I haven't been born yet, and to you I've been dead a hundred billion years. Is my body out there somewhere, in the ground? Doctor: ... Yes... I suppose it is. Clara: But hear we are talking, so I am a ghost. To you, I'm a ghost. We're all ghost to you. We must be nothing. Doctor: No, no. You're not that. Never that. Clara: They what are we? What can we possible be? Doctor: You are the only mystery, worth solving.") :Cyberman (unit :name "Cyberman" :image "DrWho/Cyberman.png" :reference "We have 5 million Cybermen. How many are you? Four! You would destroy the Cybermen with 4 Daleks? We would destroy the Cybermen with 1 Dalek! You are superior to us in only one respect. You are better at dying! - Cybermen and Daleks") :Dalek (unit :name "Dalek" :image "DrWho/Dalek.png" :reference "Imagine you were dying. Imagine you were afraid and a long way from home and in terrible pain. And just when you thought it couldn't get worse, you looked up and saw the face of the devil himself. Hello Dalek - The Doctor" :summary "The Daleks odd form may be explained by their personal shielding. Weapons and sensors are placed on stalks so that they may protrude from the shield. This prevents their shield from interfering with their equipment, but it also leaves these devices vulnerable." :unitpowermap (unitpowermap :Armor (unitpower :name "Armor") :Shielding (unitpower :name "Shielding"))) :Davros (unit :name "Davros" :image "DrWho/Davros.png" :reference "* To hold in my hand a capsule that contained such power...To know that the tiny pressure of my thumb, enough to break the glass would end...everything...Yes...I WOULD do it. Such power would put me above the Gods! - Davros * Across the entire universe, never stopping, never faltering, never fading. People, planets, and stars will become dust, and the dust will become atoms, and the atoms will become...nothing. Into every dimension, every parallel, every single corner of creation. This is my ultimate victory, Doctor: the destruction of reality... itself! - Davros * The man who abhors violence, never carrying a gun. But this is the truth Doctor, you take ordinary people and fashion them into weapons...How many more? Just think how many have died in your name...The Doctor, the man who keeps running, never looking back because he dare not out of shame. This is my final victory, Doctor. I have shown you...yourself. - Davros") "Doctor, The" (unit :name "Doctor, The" :image "DrWho/TheDoctor.png" :reference "* Who are you? ... The ground beneath our feet spinning at a 1000 miles an hour, and the entire planet is hurtling around the sun at 67,000 miles an hour, and I can feel it. We're falling through space, you and me, clinging to the skin of this tiny little world, and if we let go ... That's who I am. Now forget me. - Rose and The Doctor * Oh, I'll think of something. You're just making this up as you go along. Yup...but I do it brilliantly - The Doctor * I've seen him. He's like fire and ice and rage. He's like the night and the storm and the heart of the sun. He's ancient and forever. He burns at the center of time and he can see the turn of the universe. * Is this world protected? You're not the first lot to have come here. Oh, there have been so many. And what you've got to ask is...what happened to them? Hello, I'm the Doctor. Basically...run. - The Doctor * Everyone's got memories of a holiday they couldn't have be to, or a party they never went to, or met someone for the first time and felt like they've know them all their lives. Time is being rewritten all around us, everyday. People think their memories are bad, but their memories are fine. The past is really like that. - The Doctor * There are laws of time and once upon a time, there were people in charge of those laws, but died. They all died. They all died. And you know who that leaves. Me! It has taken me all these years to realize, the laws of time are mine. And they will obey me! ... The whole of history could change...the future of the human race. No one should have that much power. Tough. ... For a long time I thought I was just a survivor, but I'm not. I'm the winner. That's who I am. The Time Lord Victorious. And there is no one to stop you. No. This is wrong, Doctor. I don't care who you are. The Time Lord Victorious is wrong! That's for me to decide. ... Is there nothing you can't do? Not anymore. - Captain Aldelede and The Doctor * Silence will fall when the question is asked...The first question, the question that must never be answered, hidden in plain sight, the question you've been running from all your life...Doctor WHO? * If I run away today. Good people will die. If I stand and fight, some of them might live. Maybe not many. Maybe not for long. Hey, maybe there's no point in any of this at all, but its the best I can do. So, I'm going to do it, and I will stand here doing it until it kills em. You're going to die too. Someday. What would that be? Have you thought of that? Would you die for? Who I am is where I stand. Where I stand... is where I fall. Stand with me. - Doctor and Masters. * People always get it wrong with Time Lords. We take forever to die. Even if we are too injured to regenerate, every cell in our bodies keeps trying. Dying properly can take days. That's why we like to die among our own kind. They know not to bury us early. I think... In my current condition, it'll take me about... a day and a half to reach the top of the tower. I think, if I'm lucky, I have a day and a half. - Heaven Sent") :K-9 (unit :name "K-9" :image "DrWho/K9.png" :reference "The Doctor likes traveling with an entourage. Sometimes they're human, sometimes they're aliens and sometimes they're tin dogs. What about you? Where do you fit in the picture? Me? I'm their man in Havana. I'm their technical support. I'm... Oh my god. I'm the tin dog! - Sarah Jane Smith and Mickey Smith") "Martha Jones" (unit :name "Martha Jones" :image "DrWho/MarthaJones.png" :reference "She completely adored him ... Is this going anywhere? Yes. Cause he never looked at her twice ... and she wasted years of her life ... and I told her time and time again. Get out. So this is me getting out. - Martha Jones and the Doctor") "Master, The" (unit :name "Master, The" :image "DrWho/TheMaster.png" :reference "* We stand there... 8 years old... staring at the raw power of time and space, just a child. Some would be inspired... Some would run away ... and some would go mad. What about you? Oh, the one who ran away. I never stopped. - The Doctor and Martha * And so it came to pass, that the human race fell and the Earth was no more. And I looked out on my new Dominion as master of all and I thought it good.") "Rose Tyler" (unit :name "Rose Tyler" :image "DrWho/RoseTyler.png" :reference "This is really seeing the future - you just leave us behind! ... Sarah Jane - you were that close to her once, and now ... you never even mention her. ... I don't age. I regenerate. But humans decay. You wither and you die. Imagine watching that happen to someone you ... You can spend the rest of your life with me. But I can't spend the rest of mine with you. I have to live on, alone. That's the curse of the Timelords. - Rose and the Doctor, Doctor Who") "Sarah Jane Smith" (unit :name "Sarah Jane Smith" :image "DrWho/SarahJaneSmith.png" :reference "The universe has to move forward. Pain and loss, they define us as much as happiness or love. Whether it's a world, or a relationship ... Everything has its time. And everything ends. - Sarah Jane Smith") :Rutan (unit :name "Rutan" :image "DrWho/Rutan.png") :Sontaran (unit :name "Sontaran" :image "DrWho/Sontaran.png") "Sontaran Scout Ship" (unit :name "Sontaran Scout Ship" :image "DrWho/SontaranScoutShip.png") :Sutekh (unit :name "Sutekh" :reference "* You would use your powers for evil. Evil? Your evil is my good. I am Sutehk the Destroyer. Where I tread, I leave nothing but dust and darkness. I find that good. - The Doctor and Sutekh" :titles "Sutekh the Destroyer") "Weeping Angel" (unit :name "Weeping Angel"))))) :Robotech (chapter :name "Robotech" :sectionmap (sectionmap :Zentradi (section :name "Zentradi"))) "Space Cruiser Yamato" (chapter :name "Space Cruiser Yamato" :summary "Aka Starblazers" :sectionmap (sectionmap "Comet Empire" (section :name "Comet Empire" :unitmap (unitmap "Prince Zordar" (unit :name "Prince Zordar" :image "SpaceBattleshipYamato/PrinceZordar.png" :summary "I hold the whole universe in the palm of my hand. I just close my hand and planet crumble, the stars shatter! What chance does your planet Earth have? It's a cosmic joke. - Prince Zordar") "Comet Empire" (unit :name "Comet Empire" :image "SpaceBattleshipYamato/CometEmpire.png") :Medaruhse (unit :name "Medaruhse" :summary "Its principal weapon is a large plasma cannon which fires directly into a SMITE field which teleports the energy to a considerable distance. This gives the weapon a tremendous firing range more than twice that of a Wave Motion Gun." :titles "Magna Flame Gun" :unitpowermap (unitpowermap :Armor (unitpower :name "Armor")) :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :level "5" :unititemmap (unititemmap "Magna Flame Gun" (unititem :name "Magna Flame Gun"))))))))) "Space Opera" (chapter :name "Space Opera" :sectionmap (sectionmap "Interstellar Vehicles" (section :name "Interstellar Vehicles" :unitmap (unitmap "Islander Star Sloop" (unit :name "Islander Star Sloop" :summary "* The Islander is the smallest class merchant starship commonly available. It can carry 30tons of cargo, 4 low passage passengers, and 10 coldsleep bays. * 1x Light Particle Cannon * 6x Light Startorpedoes * The Islander has seen many modifications including high speed drives for courier or smuggling as well as heavier armaments." :mass "125tons") "Deep Space Probe" (unit :name "Deep Space Probe") "Corsair Star Privateer" (unit :name "Corsair Star Privateer" :summary "* The Starfarer is a small merchant starship designed for dangerous courier duty. As such, it has reduced cargo capacity and increased armor, and weapons. Its high firepower makes it popular among smugglers and pirates, though its high price means that few of these are procured through normal channels. * 50tons of cargo * 6 crew * 10 low passage passengers * 10 coldsleep bays. * 4x Medium Particle Cannon * 6x Light Startorpedoes * The Banner has seen many modifications including high speed drives for courier or smuggling as well as heavier armaments." :mass "250tons") "Valkyrie Patrol Star Cruiser" (unit :name "Valkyrie Patrol Star Cruiser" :summary "* The Valkyrie is a long range cruiser designed for planetary defense. * The Valkyrie acts as a mothership for up to 4 Nike class frigates that it carries and services. * 600tons cargo * 80 Crew * 60 low passage passengers * 20 coldsleep bays. * 8x Heavy Particle Cannon * 12x Light Particle Cannon * 6x Heavy Startorpedoes" :mass "12500tons") "Nike Patrol Space Frigate" (unit :name "Nike Patrol Space Frigate" :summary "* The Nike is a short range frigate designed for planetary defense. As a planetary defense ship it is highly maneuverable and carries a heavy weapons load for a small ship. * The Nike is transported longer distances by the larger Nemesis class. * 30tons cargo * 4 Low Passage passengers * 10 coldsleep bays. * 2x Medium Particle Cannon * 6x Light Particle Cannon * 6x Medium Startorpedoes * 10x Heavy Startorpedoes" :mass "375tons") "Oliphant Luxury Starliner" (unit :name "Oliphant Luxury Starliner" :summary "* 600 High Passage Accommations * 1200 Medium Passage Accommations * 2400 Low Passage Accommations * 1000 Coldsleep berths" :mass "75000tons") "Space Cutter" (unit :name "Space Cutter" :summary "* Larger than the Pinnacle, the Cutter can travel back and forth from a planet to its moon." :mass "60tons") "Space Lander" (unit :name "Space Lander" :summary "* Larger than the Cutter, the Lander can travel back and forth from a planet to its moon and is used to haul heavy equipment or passengers. In combat, the Lander is the prefered method to deploy infantry and tanks after a marine orbital halo drop." :mass "200tons") "Space Pinnacle" (unit :name "Space Pinnacle" :summary "* Larger than the Shuttlecraft, the Pinnacle can travel from orbit to a planet's moon and return." :mass "30tons") "Space Shuttlecraft" (unit :name "Space Shuttlecraft" :summary "* The shuttlecraft is the smallest of the ship's boats. It is capable of orbital travel to shuttle small complements of crew and cargo planetside." :titles "Launch" :mass "10tons") "Star Colony Ship" (unit :name "Star Colony Ship") "Sub-light Sleeper Ship - Ark" (unit :name "Sub-light Sleeper Ship - Ark") "Zephyr Startransport" (unit :name "Zephyr Startransport" :summary "* The Zephyr is a small merchant starship designed for comfortable passenger duty along major trade routs. As such, it has reduced cargo capacity and increased armor, and weapons. Its high firepower makes it popular among smugglers and pirates, though its high price means that few of these are procured through normal channels. * 75tons cargo * 6 crew * 10 Medium Passage Accommations * 30 Low Passage Accommations * 20 Coldsleep berths * 2x Light Particle Cannon * 6x Light Startorpedoes * The Banner has seen many modifications including high speed drives for courier or smuggling as well as heavier armaments." :mass "300tons"))))) "Star Trek" (chapter :name "Star Trek" :sectionmap (sectionmap "Alien Races" (section :name "Alien Races" :unitmap (unitmap "Borg Cube" (unit :name "Borg Cube" :image "StarTrek/Borg_Cube.png" :reference "We are the Borg. Lower your shields and surrender your ships. We will add your biological and technological distinctiveness to our own. Your culture will adapt to service us. Resistance is futile. - The Borg, Star Trek First Contact" :crew "130000" :mass "90Mtons" :length "3km" :unitpowermap (unitpowermap :Shielding (unitpower :name "Shielding" :summary "Adaptive Shielding total capacity 5,850,900TJ")) :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :summary "Total output 7,500,000TW" :level "4"))) "Borg Drone" (unit :name "Borg Drone" :image "StarTrek/Borg_Drone.png" :reference "The Borg were possibly created by the alien probe V'Ger to seek 'all that is knowable' and return to its creator.") "Doomsday Machine" (unit :name "Doomsday Machine" :image "StarTrek/DoomsdayMachine.png" :reference "Believed to have originated as an ancient race's last resort weapon against the Borg. Its basic design - destroy planets already assimilated by the Borg for use as fuel - coupled with an indestructible neutronium hull and antiproton beam (against which there was little or no defense), made it an ideal weapon against the Borg." :summary "* Maximum Speed: Warp 4 * Tractor Beam * Dampening Field * Can consume a planet in a day" :titles "Planet Killer" :classification "Hvy. Spacecraft" :mass "4x10^23tons" :length "2.7km" :unitpowermap (unitpowermap :Armor (unitpower :name "Armor" :summary "Solid Neutronium - Hyper Dense Neutron Star Material")) :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :level "4" :unititemmap (unititemmap "Anti-Proton Beam" (unititem :name "Anti-Proton Beam"))))) "Klingon Bird of Prey" (unit :name "Klingon Bird of Prey" :image "StarTrek/Klingon_BirdOfPrey.png" :unitpowermap (unitpowermap :Armor (unitpower :name "Armor") :Shielding (unitpower :name "Shielding") :Weaponry (unitpower :name "Weaponry" :unititemmap (unititemmap "Disruptor Bank" (unititem :name "Disruptor Bank") "Photon Torpedo" (unititem :name "Photon Torpedo"))) :Invisibility (unitpower :name "Invisibility" :unititemmap (unititemmap "Cloaking Device" (unititem :name "Cloaking Device")))) :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :level "4"))) "Klingon Cruiser" (unit :name "Klingon Cruiser" :image "StarTrek/Klingon_Cruiser.png" :unitpowermap (unitpowermap :Armor (unitpower :name "Armor") :Shielding (unitpower :name "Shielding") :Weaponry (unitpower :name "Weaponry" :unititemmap (unititemmap "Disruptor Bank" (unititem :name "Disruptor Bank") "Photon Torpedo" (unititem :name "Photon Torpedo")))) :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :level "5"))) "Klingon Warrior" (unit :name "Klingon Warrior" :image "StarTrek/Klingon_Warrior.png" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee"))) "Nomad Probe" (unit :name "Nomad Probe" :image "StarTrek/Nomad.png" :reference "* Error! Error!...Faulty! Faulty! Must sterilize imperfection! - STER-I-LIZE! - Nomad, Star Trek * Nomad - See the universe. Meet interesting people...and kill them. - Motivational Poster Parody") "Romulan Centurion" (unit :name "Romulan Centurion" :image "StarTrek/Romulan_Centurion.png") "Romulan Warbird" (unit :name "Romulan Warbird" :image "StarTrek/Romulan_Warbird.png" :unitpowermap (unitpowermap :Armor (unitpower :name "Armor") :Shielding (unitpower :name "Shielding")) :unitskillmap (unitskillmap :Gunnery (unitskill :name "Gunnery" :level "4" :unititemmap (unititemmap "Disruptor Bank" (unititem :name "Disruptor Bank") "Photon Torpedo" (unititem :name "Photon Torpedo"))))) "Species 8472" (unit :name "Species 8472" :image "StarTrek/Species8472.png") :V'Ger (unit :name "V'Ger" :image "StarTrek/VoyagerVI.png" :reference "Voyager VI - Tell Nomad I'm going to kick his ass. - Motivational Poster Parody" :titles "Voyager VI" :length "98km"))))) "Star Wars" (chapter :name "Star Wars" :sectionmap (sectionmap :Rebels (section :name "Rebels" :unitmap (unitmap :Chewbacca (unit :name "Chewbacca" :image "StarWars/Rebel_Chewbacca.png" :unitskillmap (unitskillmap :Firearms (unitskill :name "Firearms" :level "4" :unititemmap (unititemmap "Blaster Rifle" (unititem :name "Blaster Rifle"))) :Piloting (unitskill :name "Piloting" :level "5"))) "Han Solo" (unit :name "Han Solo" :image "StarWars/Rebel_HanSolo.png" :reference "I ain't in this for your revolution, and I'm not in it for you, Princess. I expect to be well paid. *I'm* in it for the money. - Han Solo, Star Wars" :unitskillmap (unitskillmap :Firearms (unitskill :name "Firearms" :level "5" :unititemmap (unititemmap "Blaster Pistol" (unititem :name "Blaster Pistol"))) :Piloting (unitskill :name "Piloting" :level "8"))) "Luke Skywalker" (unit :name "Luke Skywalker" :image "StarWars/Rebel_LukeSkywalker.png" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee" :level "7" :unititemmap (unititemmap :Lightsaber (unititem :name "Lightsaber"))) :Firearms (unitskill :name "Firearms" :level "3" :unititemmap (unititemmap "Blaster Pistol" (unititem :name "Blaster Pistol"))) :Piloting (unitskill :name "Piloting" :level "6"))) "Ben Kenobi" (unit :name "Ben Kenobi" :image "StarWars/Rebel_BenKenobi.png" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee" :level "8" :unititemmap (unititemmap :Lightsaber (unititem :name "Lightsaber"))) :Piloting (unitskill :name "Piloting" :level "6"))) "Princess Leia Organa" (unit :name "Princess Leia Organa" :image "StarWars/Rebel_PrincessLeia.png" :reference "* Someone has to save our skins. Into the garbage chute, fly boy - Princess Leia, Star Wars" :unitskillmap (unitskillmap :Firearms (unitskill :name "Firearms" :level "5" :unititemmap (unititemmap "Blaster Pistol" (unititem :name "Blaster Pistol"))))) :Yoda (unit :name "Yoda" :image "StarWars/Yoda.png" :unitskillmap (unitskillmap :Melee (unitskill :name "Melee" :level "10" :unititemmap (unititemmap :Lightsaber (unititem :name "Lightsaber"))))))))) "Time Travellers" (chapter :name "Time Travellers" :reference "* Doctor: People don't understand time. It's not what you think it is. Sally: Then what is it? Doctor: Complicated. Sally: Tell me. Doctor: Very complicated. ... Doctor: People assume that time is strict progression of cause of cause to effect, but actually from a non-linear, non-subjective viewpoint, its more like a big ball of wibbly-wobbly, timey-wimey stuff... Sally Sparrow, Doctor - Blink - Doctor Who" :sectionmap (sectionmap "Temporal Vehicles" (section :name "Temporal Vehicles" :unitmap (unitmap "Time Rotor" (unit :name "Time Rotor" :image "DistantFuture/TimeRotor.jpg" :reference "* Eternal Sunshine of the Spotless Mind * Flatliners * Vortex in Doctor Who credits * Time Stranger Anime * Time Travel in Terminator Series" :summary "* Description - The Temporal Rotor is an amazing device created by a vanished civilization. It is mostly a communication device that can reach into the Temporal Vortex and communicate with the central computer Chronos on the asteroid Babylon. Chronos harnesses the black hole hidden within Bablyon to move the Time Rotor and its operator through time and space. It is perhaps the most powerful device ever created. * Activating the Temporal Rotor - When the Temporal Rotor is activated, static electricity begins to build in the area. At full strength the static is dangerous, so travellers should not move to avoid discharge. A glowing field begins to form. Travellers heart rate begins to climb and they have a sudden feeling of intense, unnatural danger and imminent death. Hearts begin to fibrilate and flatline. * Entering the Vortex - The travellers blink and become aware that they are in the Vortex. Further, they recognize that they have always been in the Vortex. Every moment of their life remembered as if it just occurred. Only their future remains unseen. Time in the Vortex has no meaning, so travellers may leave immediately or stay for an eternity before moving on. * Leaving the Vortex - Leaving is just as traumatic as entering. As the Temporal Rotor slows, the travellers begin to forget all that they have just remembered. It is like losing one's mind bit by bit. They feel torn apart and incomplete. Soon they start losing coherent thought, their minds becoming simple and primal. Their senses and desires become simple: Food, Sex, Fear, Violence, Warmth ... Food, Fear, Violence, Warmth ... Food, Warmth ... Warmth. All is dark, wet, and warm as it has always been. Soft, pink bubbles surround and comfort you. You have no wants. You are complete. Suddenly a bright light blinds you, and happiness and security are torn from you. And there is pain, pain where there never was pain before. Waves of burning pain crush you, chew you up, and spit you out. You lie on the ground, cold and in shock. A new pressure builds in your chest, and without thinking you gasp and take in your first breath. Your eyes open to see the last lights on the Temporal Rotor wink out. You are coverered in a heavy, red jelly like congealed blood. The jelly quickly dries to dust and disappears. You rise and feel healthier than ever before. Old wounds and scars are gone as if they never were, and you are different: your skin, your teeth, your hair, your language all are as if you were born and lived your life in this time and place. Your equipment is gone and your clothes have been replaced with simple native garb: a gift from Chronos." :height "1.5m" :width ".2m") :Timefighter (unit :name "Timefighter"))))) "Unique Aliens" (chapter :name "Unique Aliens" :sectionmap (sectionmap "Alien Life Forms" (section :name "Alien Life Forms" :unitmap (unitmap :Arachnid (unit :name "Arachnid" :reference "Starship Troopers" :titles "Bug") :Blob (unit :name "Blob") "Puppet Master" (unit :name "Puppet Master") "Thing from another World" (unit :name "Thing from another World"))))))))
nx/tactics/books/skills
Description:
Package Name:
  • nx/tactics/books/skills
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
Functions:
  • tacticsbook
Source Code:
  • (package nx/tactics/books/skills :libs (lib base :path nx/tactics/base)) (func tacticsbook : base/book (book :name "Skills" :image "Skill.jpg" :chaptermap (chaptermap "Skills Overview" (chapter :name "Skills Overview" :sectionmap (sectionmap "Extraordinary Skills" (section :name "Extraordinary Skills" :reference "* What you call tao. It's a power everyone possesses innately, but mastering it allows one to achieve superhuman abilities... But you must be careful how you use it. Tao is life itself. Use too much, and you'll exhaust more than just your stamina... In the worst case, overuse likely leads to death. - Shion-dono , Hell's Paradise") "Why Tactics: Skills?" (section :name "Why Tactics: Skills?" :sectionmap (sectionmap "Extraordinary Skills" (section :name "Extraordinary Skills" :reference "* What you call tao. It's a power everyone possesses innately, but mastering it allows one to achieve superhuman abilities... But you must be careful how you use it. Tao is life itself. Use too much, and you'll exhaust more than just your stamina... In the worst case, overuse likely leads to death. - Shion-dono , Hell's Paradise"))))) "Skill Types" (chapter :name "Skill Types" :sectionmap (sectionmap "Social Skills" (section :name "Social Skills" :skillmap (skillmap :Art (skill :name "Art" :reference "* Art requires a certain... cruelty. - Jhin, Runeterra" :titles "Artist, Artisan" :stat "Spirit" :abilitymap (abilitymap "Art Imitates Life" (ability :name "Art Imitates Life" :reference "Dorian Gray" :summary "Artwork become real") :Calligraphy (ability :name "Calligraphy") :Crafts (ability :name "Crafts") :Drawing (ability :name "Drawing") :Painting (ability :name "Painting") :Photoshopping (ability :name "Photoshopping" :summary "* Modify an image to improve or mislead.") :Sculpture (ability :name "Sculpture"))) :Business (skill :name "Business" :reference "* Did they get you to trade? Your heroes for ghosts? Hot ashes for trees? Hot air for a cool breeze? Cold comfort for change? Did you exchange? A walk-on part in the war. For a leading role in a cage? - Pink Floyd, Wish you were here" :titles "Commerce" :abilitymap (abilitymap :Accounting (ability :name "Accounting" :titles "Accountant, Actuary, Clerk") :Advertising (ability :name "Advertising" :titles "Marketing Representative") :Appraise (ability :name "Appraise" :summary "* Determine the value of an item in the current market.") :Bargain (ability :name "Bargain" :summary "* Ability that Limits any attempt to buy or sell goods at their actual worth." :titles "Haggler, Merchant") :Barter (ability :name "Barter" :summary "* Ability that Limits any attempt to buy or sell goods at their actual worth.") "Business Management" (ability :name "Business Management") :Distribution (ability :name "Distribution") :Economics (ability :name "Economics" :reference "* In 5 minutes, you learn what the average University student remembers 5 years after learning school ... Economics: Supply and Demand. That's it. - Father Guido Sarducci, Five Minute University") :Finance (ability :name "Finance") :Marketing (ability :name "Marketing") :Procure (ability :name "Procure" :summary "The ability to find rare, exotic or illegal items for sale or trade." :titles "Procurer") :Sales (ability :name "Sales" :reference "* In 5 minutes, you learn what the average University student remembers 5 years after learning school ... Business is: You buy something, you sell it for more - Father Guido Sarducci, Five Minute University" :titles "Carpetbagger, Peddler, Salesman") :Speculate (ability :name "Speculate") "Trade Routes" (ability :name "Trade Routes") "Trade Union" (ability :name "Trade Union"))) :Communications (skill :name "Communications" :abilitymap (abilitymap :Appearance (ability :name "Appearance" :summary "* Expert on personal grooming, cosmetics, and hairstyling.") :Carousing (ability :name "Carousing") "Detect Lie" (ability :name "Detect Lie") :Drinking (ability :name "Drinking") :Drugs (ability :name "Drugs") :Etiquette (ability :name "Etiquette") :Fashion (ability :name "Fashion" :summary "* Knows current fashions and what clothing with make the best impact.") :Fiction (ability :name "Fiction" :summary "* Can author, critique, interpret, and detect fiction.") "Go Viral" (ability :name "Go Viral" :summary "* Create an interesting message popular enough to be passed around.") :Gossip (ability :name "Gossip" :summary "* The single best way to get information, but, given it source, may not be reliable.") :Interview (ability :name "Interview" :titles "Interviewer, Reporter") :Journalism (ability :name "Journalism" :titles "Journalist, Media, Reporter") :Literacy (ability :name "Literacy" :summary "* Can read and write * This ability is assumed in modern characters from 1st and 2nd world nations") "Motivational Speaking" (ability :name "Motivational Speaking" :reference "* My name is Matt Foley and I am a motivational speaker... First off, I am thirty-five years old, I am divorced, and I live in a van down by the river... Well I'm here to tell you, that you're probably going to find out, as you go out there, that you're not going to amount to jack squat! You're going to end up eating a steady diet of government cheese and living in a van down by the river! - Matt Foley, SNL" :titles "Motivational Speaker") :Negotiation (ability :name "Negotiation" :titles "Advisor, Arbiter, Diplomat, Emissary, Envoy, Legate, Negotiator") :Photography (ability :name "Photography" :titles "Photographer") :Poetry (ability :name "Poetry" :summary "Can author any type of poetry" :titles "Poet") :Politics (ability :name "Politics") :Recruiting (ability :name "Recruiting" :titles "Casting Director, Hiring Manager, Recruiter") :Scribe (ability :name "Scribe" :summary "* Can copy writings exactly") :Sincerity (ability :name "Sincerity" :summary "* Helps convince others when you are being truthful. * Helps improve long term relationships by increasing trust. * Limitation - May only be used when you truly believe that your are correct.") "Small Talk" (ability :name "Small Talk" :titles "The Gift of Gab") :Streetwise (ability :name "Streetwise" :summary "* [Action]: Gain knowledge where a good or service can be found in a city including black market goods or services.") :Translator (ability :name "Translator" :summary "* Can translate immediately") "Trash Talk" (ability :name "Trash Talk" :reference "* What's the matter Agent Scary Lips? You're Scary Lips tasting my hairy shit? You tasting Doug Wilson's World Famous beef stew? How's it going down, its kinda spicy right? You guys are so fucked right now, all I can think about is your wife and a horse. - Doug Wilson, Weeds" :titles "Put Down") :Videography (ability :name "Videography" :titles "Cameraman, Videographer") "Video Production" (ability :name "Video Production" :titles "Director, Producer") "Wise Words" (ability :name "Wise Words" :summary "* Apply personal life experiences to help others understand themselves.") :Cantonese (ability :name "Cantonese") :English (ability :name "English") :French (ability :name "French") :German (ability :name "German") :Greek (ability :name "Greek") :Italian (ability :name "Italian") :Latin (ability :name "Latin") :Mandarin (ability :name "Mandarin") "Olde English" (ability :name "Olde English") :Portuguese (ability :name "Portuguese") :Russian (ability :name "Russian") "Sign Language" (ability :name "Sign Language") :Spanish (ability :name "Spanish")) :specialtymap (specialtymap :Linguistics (specialty :name "Linguistics" :reference "* So we put her on the hit list, of a common, cunning linguist: a master of many tongues. - Deep Purple, Knocking at Your Backdoor" :summary "* Philosophy - The 'common tongue' concept is boring and unrealistic. * Simulate the limitations of language by reducing usable vocabulary. This can be done by limiting a conversation to 2, 3, 4, or 5 letter words depending on the fluency of those involved. Having a conversation using only 2 letter words is going to require a fair amount of hand gesturing or drawing to get a point across. If a person is overhearing a conversation, bleep out the big words and let them guess at the missing words.") :Writing (specialty :name "Writing"))) :Crime (skill :name "Crime" :titles "Bandit, Brigand, Crime Boss, Crook, Cutthroat, Highwayman, Pimp, Yakuza, Yakuza - Oyabun" :stat "Shadow" :abilitymap (abilitymap "Armed Robbery" (ability :name "Armed Robbery") :Blackmail (ability :name "Blackmail") :Bribery (ability :name "Bribery") "Crime Syndicate" (ability :name "Crime Syndicate") "Crime Wave" (ability :name "Crime Wave") "Criminal Mastermind" (ability :name "Criminal Mastermind") :Extortion (ability :name "Extortion") "Fence Goods" (ability :name "Fence Goods") :Kidnapping (ability :name "Kidnapping") "Mafia Connections" (ability :name "Mafia Connections") :Pimping (ability :name "Pimping") :Piracy (ability :name "Piracy" :summary "* Armed robbery of large shipments of goods without damaging the merchandise.") :Prostitution (ability :name "Prostitution") :Rustling (ability :name "Rustling" :summary "* Stealing and selling livestock") :Waylay (ability :name "Waylay"))) :Deception (skill :name "Deception" :reference "* I whisper Truth, into Lies... - Leblanc, Runeterra" :titles "Chicanery, Legerdemain" :stat "Shadow" :abilitymap (abilitymap :Burglary (ability :name "Burglary") "Con Artist" (ability :name "Con Artist") "Confidence Game" (ability :name "Confidence Game" :titles "Con Artist, Swindler") :Decoy (ability :name "Decoy" :summary "* Create a decoy to mislead. * [Move]: Remove this unit from play and place 1 Decoy Token and 1 Decoy Unit Token on this unit's space. Both decoys may act normally during the Action phase, but any action but movement will dispel the decoys. Both decoys defend as the original unit. If either unit is Hit, both decoys are dispelled. The decoys last until the next turn or until dispelled.") "Detect Trap" (ability :name "Detect Trap") :Distraction (ability :name "Distraction" :titles "Throw Dirt") :Escape (ability :name "Escape" :reference "* The chain in those handcuffs is high-tensile steel. It'd take you ten minutes to hack through it with this. Now, if you're lucky, you could hack through your ankle in five minutes. Go." :summary "* The ability comes from extensive practice escaping from various bonds and confinements. At higher abilities, the user can dislocate joints to slither out of bonds." :titles "Escape Artist") "Evade Pursuit" (ability :name "Evade Pursuit" :summary "* Ability to correctly evaluate the opponent's pursuit style and outwit the pursuer.") :Forgery (ability :name "Forgery" :summary "* The ability to forge money or documents. This ability is also used while creating money to prevent forgery. * [Extended Action]: Roll vs. object quality or anti-forgery level. Any [Hits] allow a forgery that can pass at a distance. The more [Hits] and [Criticals] rolled, the more indistinquishable from the original. High level forgeries are works of art unto themselves.") :Gambling (ability :name "Gambling" :titles "Gambler, High Roller") "Honor Among Thieves" (ability :name "Honor Among Thieves") :Misdirection (ability :name "Misdirection") "Pick Pockets" (ability :name "Pick Pockets") "Sleight of Hand" (ability :name "Sleight of Hand" :summary "* Hide a small object in hand without being noticed." :titles "Legerdemain") :Smuggling (ability :name "Smuggling") "Stage Magic" (ability :name "Stage Magic") "Thieves Guild Codes" (ability :name "Thieves Guild Codes" :summary "Thieves must conceal their illegal conversations and the guilds have developed a shifting series of hand signals, marks, and code words to communicate simple concepts without arising suspiscion.") "Use Blinding Powder" (ability :name "Use Blinding Powder") "Use Flash Powder" (ability :name "Use Flash Powder") "Use Irritating Powder" (ability :name "Use Irritating Powder") "Use Sleeping Powder" (ability :name "Use Sleeping Powder") :Vanish (ability :name "Vanish") :Ventriloquism (ability :name "Ventriloquism")) :specialtymap (specialtymap :Thievery (specialty :name "Thievery" :reference "This is where Forrestall cashed in. A friend of yours? A competitor... he was good. He was very good. - Indiana Jones, Raiders of the Lost Ark" :summary "* Burglary, Escape, Fence Goods, Honor Among Thieves, Pick Pockets, Smuggling, Thieves Guild Codes" :titles "Burglar, Cutpurse, Footpad, Nezumi kozo, Pick Pocket, Smuggler, Thief") :Trickery (specialty :name "Trickery" :summary "* Blinding Powder, Confidence Game, Decoy, Distraction, Flash Powder, Gambling, Irritating Powder, Misdirection, Sleight of Hand, Stage Magic, Swindling, Vanish, Ventriloquism" :titles "Blackguard, Caitiff, Charlatan, Con Artist, Delinquent, Gambler, Knave, Ne'er do well, Ninja, Rapscallion, Renegade, Riffraff, Rogue, Scoundrel, Scalawag, Stage Magician, Swashbuckler, Swindler, Trickster"))) :Espionage (skill :name "Espionage" :titles "Covert Ops, Infiltrator, Informer, Spy, Traitor" :stat "Shadow" :abilitymap (abilitymap :Counterintelligence (ability :name "Counterintelligence") "Cyber Intelligence" (ability :name "Cyber Intelligence" :summary "* Intelligence gathered from computer networks." :titles "CYBINT, DNINT, Digital Network Intelligence") :Eavesdrop (ability :name "Eavesdrop" :summary "* Listen in to conversations without being detected.") :Infiltrate (ability :name "Infiltrate" :summary "* [Defense] - Mind * [Deploy] - Deploy this unit in waiting area. * [Action] - Replace any non-unique unit with this unit.") "Geospatial Intelligence" (ability :name "Geospatial Intelligence" :summary "* Intelligence gathered from satellite, aerial photography, mapping. * Espionage, Diplomats, Military Attaches, NGOs, Patrolling, POWs Detainees, Refugees, Strategic Reconnaissance, Traveller Debriefing" :titles "GEOINT, IMINT, Imagery Intelligence") "Human Intelligence" (ability :name "Human Intelligence" :summary "* Intelligence gathered from a person on the ground. * Espionage, Diplomats, Military Attaches, NGOs, Patrolling, POWs Detainees, Refugees, Strategic Reconnaissance, Traveller Debriefing" :titles "HUMINT") "Intelligence Network" (ability :name "Intelligence Network" :reference "If you thought there was some secret cell somewhere working Al Qaedia. Then I want you to know you're wrong. This it it. There is no working group coming to the rescue. There is nobody else hidden on some other floor. There is just us... and we are failing!... They murdered 3000 of our citizens..in cold-blood and they have slaughtered our forward deploy. And what the fuck have we done about it, huh? What have we done?! We have 20 leadership names. We have only eliminated 4 of them. I want targets. Do your fucking jobs. Bring me people to kill. - Zero Dark Thirty") "Lip Reading" (ability :name "Lip Reading" :summary "* Attempt to understand what is being said without the benefit of hearing. The more [Hits] rolled, the more accurate the interpretation.") "Measurement and Signals" (ability :name "Measurement and Signals" :summary "* Intelligence gathered from the signatures (distinctive characteristics) of fixed or dynamic target sources. This includes radar, acoustic, nuclear, chemical, and biological intelligence." :titles "MASINT") :Misdirection (ability :name "Misdirection" :reference "* Smoke and Mirrors... Classic Misdirection - Leblanc, Runeterra") "Open Source Intelligence" (ability :name "Open Source Intelligence" :summary "* Intelligence gathered from open sources." :titles "OSINT") :Propaganda (ability :name "Propaganda") "Quick Change" (ability :name "Quick Change") :Sabotage (ability :name "Sabotage" :titles "Saboteur") "Signals Intelligence" (ability :name "Signals Intelligence" :reference "* Quiller" :summary "* Intelligence gathered from interception of signals." :titles "SIGINT, Signals") :Subversion (ability :name "Subversion") "Technical Intelligence" (ability :name "Technical Intelligence" :summary "* Intelligence gathered from analysis of weapons and equipment." :titles "TECHINT") "Whispering Campaign" (ability :name "Whispering Campaign"))) :Faith (skill :name "Faith" :reference "The argument goes something like this: 'I refuse to prove that I exist,' says God, 'for proof denies faith, and without faith I am nothing.' 'But,' says Man, 'The Babel fish is a dead giveaway, isn't it? It could not have evolved by chance. It proves you exist, and so therefore, by your own arguments, you don't. QED.' - Hitchhiker's Guide to the Galaxy" :titles "Abbot, Absolver, Archbishop, Bishop, Cardinal, Cleric, Ceremonial Guard, Gakusho, Missionary, Paladin, Priest, Redeemer, Sin Eater, Theologist, Theurge, Theurgy" :abilitymap (abilitymap :Absolution (ability :name "Absolution") :Affirmation (ability :name "Affirmation" :summary "An affirmation is a statement designed to have a positive effect on the conscious mind when repeated at frequent intervals throughout meditation ritual spells.") :Atonement (ability :name "Atonement") :Blessing (ability :name "Blessing" :summary "* A simple incantation with a variety of subtle effects. * [Action]: Touch. Target gains a new Blessing Token (max 1). At any time, the target may remove the token and gain +1 on any Defense roll. * [Duration]: up to 1 day/level.") :Chant (ability :name "Chant" :summary "* Aura: All Allies with same Religion within level spaces receive +1 on Defense rolls.") :Confession (ability :name "Confession") :Consecration (ability :name "Consecration" :summary "* To consecrate is to solemnly dedicate or devote something or someone to a sacred purpose, to cleanse and protect.") :Contemplation (ability :name "Contemplation" :summary "* Contemplation is a focused and disiplined form of contemplation or reflecting, whereby one is able to alter an emotional state and to receive self-insight.") :Conversion (ability :name "Conversion") :Dedication (ability :name "Dedication" :summary "* [Death]: Unit enters specified Deity's realm. It is not substantiated that this ability actually works. Those who have crossed over are changed and may not and will not return.") :Drumming (ability :name "Drumming" :summary "* Drumming is literally pounding on a surface. This is used to raise power and to change emotional states.") :Excommunication (ability :name "Excommunication") :Initiation (ability :name "Initiation" :summary "* Used to describe the profound spiritual experience that occurs when one's unity with Deity and the Universe is realised; when one is welcomed as a fully-fledged member of a particular group; and the celebration of a successful ritual.") :Marriage (ability :name "Marriage") :Mass (ability :name "Mass") :Namegiving (ability :name "Namegiving") :Ordainment (ability :name "Ordainment") :Redemption (ability :name "Redemption") :Sacrament (ability :name "Sacrament") :Salvation (ability :name "Salvation") :Sanctify (ability :name "Sanctify") "Sin Eating" (ability :name "Sin Eating" :summary "* A willing subject may describe his dark desires, the Sin Eater then repeats the description replacing references to the subject with himself. After the ritual is complete, the subject will not feel the urges so strongly. Instead the Sin Eater will feel those emotions. If he acts on them, even symbolically, his [Shadow] gains power. If he can resolve them, he gains experience."))) :Influence (skill :name "Influence" :reference "* Many men, of course, became extremely rich, and this was perfectly natural and nothing to be ashamed of because no one was really poor, at least no one worth speaking of. - Hitchhiker's Guide to the Galaxy" :titles "Aristocrat, Baron, Baroness, Baronet, Celebrity, Count, Countess, Daimyo, Dame, Duchess, Duke, Emperor, Empress, King, Knight, Lord, Marchioness, Marquis, Matriarch, Monarch, Patriarch, Pontif, Prince, Princess, Queen, Regina, Sire, Sovereign, Star" :abilitymap (abilitymap "Black Market Ties" (ability :name "Black Market Ties") :Boon (ability :name "Boon") :Business (ability :name "Business") "Carte Blanche" (ability :name "Carte Blanche" :titles "Blank Check") "Corporate Ties" (ability :name "Corporate Ties") "Entertainment Ties" (ability :name "Entertainment Ties") :Fame (ability :name "Fame" :summary "* Your reputation precedes you. People are drawn to the famous and will often do extraordinary things to be near them. * [Synergy]: [Seduction] * [Action]: Leverage your fame to gain minor free goods or services including upgraded lodging, free meals, audience with nobles, etc.") "Family Ties" (ability :name "Family Ties") :Fortune (ability :name "Fortune") :Followers (ability :name "Followers" :titles "Acolyte, Apprentice, Retinue, Servant, Serf, Shieldbearer") "Friends in High Places" (ability :name "Friends in High Places" :reference "* I'm telling you this guy is protected from up on high by the Prince of Darkness. - Jeff Rabin, Usual Suspects") :Infamy (ability :name "Infamy" :summary "* Your dark reputation precedes you. People are intrigued by the infamous and will often do extraordinary things in fear and facination of them. * [Synergy]: [Intimidation] * [Action]: Leverage your infamy to gain minor free goods or services including upgraded lodging, free meals, etc.") :Intrigue (ability :name "Intrigue") :Investing (ability :name "Investing") "Judicial Ties" (ability :name "Judicial Ties") "Law Enforcement Ties" (ability :name "Law Enforcement Ties") "License to Kill" (ability :name "License to Kill") :Mansion (ability :name "Mansion") "Media Ties" (ability :name "Media Ties") "Night Club" (ability :name "Night Club") "Noble Birth" (ability :name "Noble Birth") "Official Title" (ability :name "Official Title") "Political Ties" (ability :name "Political Ties" :titles "Ambassador, Minister, Politician, Senator") "Religious Ties" (ability :name "Religious Ties") "Train Follower" (ability :name "Train Follower") "Underworld Ties" (ability :name "Underworld Ties") :Windfall (ability :name "Windfall")) :specialtymap (specialtymap :Nobility (specialty :name "Nobility" :titles "Noble Lineage") :Royalty (specialty :name "Royalty" :titles "Royal Lineage"))) :Intimidation (skill :name "Intimidation" :reference "* I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path. Where the fear has gone there will be nothing. Only I will remain. - Bene Gesserit Litany, Dune * They tell him they want his territory: all his business. Soze looks over the faces of his family, then he showed these men of will what will really was. He tells him he would rather see his family dead, than live another day after this. ... He waits until his wife and kids are in the ground, and then he goes after the rest of the mob. He kills their kids. He kills their wives. He kills their parents and their parents friends. He burns down the houses they live in and the stores they work in. He kills people who owe them money. And like that, he's gone. - Verbal Kint, Usual Suspects" :titles "Demagogue, Enforcer, Fearmonger, Overseer, Pimp, Slave Lord, Slaver, Tormentor, Torturer" :stat "Shadow" :abilitymap (abilitymap :Coercion (ability :name "Coercion" :reference "* The boat will be ready for you on Friday. If I see you or any of your friends before then, Miss. Finneran will find herself the victim of a most gruesome violation before she dies. As will your father, Mr. Hockney, and your Uncle Randall in Arizona, Mr. Kint. I might only castrate Mr. McManus's nephew, David. Do I make myself clear? - Kobayashi, Usual Suspects") "Death March" (ability :name "Death March" :summary "* Increase movement of allies within level spaces. Sustained use of this ability runs the risk of injuring or killing some allies.") :Duress (ability :name "Duress") :Enslave (ability :name "Enslave" :reference "Did you know that pain causes the formation of the strongest chemical bonds in the mammalian brain? Whip a dog, and it keeps coming back... At first it will hope that you'll stop, but after a while, it won't even know the difference. But you already know all about that don't you?... Time melted away into the pain... Finally something clicked over in his head and reality rushed back in around him, clearer and sharper than ever before... Staring he made out faces. Faces not unlike his own reflection he had seen only an eternity ago. Faces distended in howling agony... eyes welling with tears of blood, eyes that all turned toward Her, crying in admiration. - Mage: The Book of Madness") "Grip of Fear" (ability :name "Grip of Fear" :reference "* It was Keyser Soze, Agent Kujan. I mean the Devil himself. How do you shoot the devil in the back? What if you miss? - Verbal, Usual Suspects") :Interrogate (ability :name "Interrogate" :reference "* I'm gonna ask you one more goddamn time, and if you still 'respectfully refuse,' I'm callin' the Bear Jew over here, and he's gonna take that big-ole bat of his, and he's gonna beat you to death with it. Now take your wiener schnitzel lickin' finger and point out on this map what I want to know...We got a German here who wants to die for his country! Oblige him! - Lt. Aldo Raine, Inglourious Basterds * You don't need that. I'll tell you everything. Yes...I know you will. - Raiders of the Lost Ark") :Intimidate (ability :name "Intimidate" :reference "* Your timing is impeccable. Pity you were all they sent... The Fatui would do well to update their intelligence concerning me. Ah, but of course, that would require one of you to return in one piece. - Ayato, Genshin Impact * ...to the death. No. To the pain. I don't think I'm quite familiar with that phrase. ... To the pain means the first thing you will lose will be your feet below the ankles. Then your hands at the wrists. Next your nose. ...And then my ears, I understand let's get on with it. WRONG. Your ears you keep and I'll tell you why. So that every shriek of every child at seeing your hideousness will be yours to cherish. Every babe that weeps at your approach, every woman who cries out, 'Dear God! What is that THING?,' will echo in your perfect ears. That is what to the pain means. It means I leave you in anguish, wallowing in freakish misery ... forever. ...I think you're bluffing. It's possible, Pig, I might be bluffing. It's conceivable, you miserable, vomitous mass, that I'm only lying here because I lack the strength to stand. But, then again... perhaps I have the strength after all. - Princess Bride" :summary "* A form of bluffing") "Reign of Terror" (ability :name "Reign of Terror" :summary "* Use to rally troops") :Terrorize (ability :name "Terrorize" :summary "* [Attack]: Any [Critical Hits] may be [Retreats]") :Torment (ability :name "Torment") :Torture (ability :name "Torture" :reference "* Your cries of agony, where will they not reach? Where on Citaeron will they not re-echo? No man living will meet a doom more terrible than yours. - Sophocles, Oedipus Rex"))) :Law (skill :name "Law" :titles "Bailiff, Constable, Executioner, Judge, Lawbringer, Lawyer, Litigant, Magistrate, Peace Officer, Peacekeeper, Police Officer" :stat "Mind" :abilitymap (abilitymap :Authority (ability :name "Authority") "Blind Justice" (ability :name "Blind Justice") "Call In Backup" (ability :name "Call In Backup" :summary "Bring me everyone. What do you mean 'everyone'? E-V-E-R-Y-O-N-E! - Stansfield and Benny - Leon the Professional") :Condemn (ability :name "Condemn") :Confiscate (ability :name "Confiscate") "Crime and Punishment" (ability :name "Crime and Punishment") "Crowd Control" (ability :name "Crowd Control") "Detective Work" (ability :name "Detective Work" :reference "* To a cop the explanation is never that complicated. It's always simple. There's no mystery to the street, no arch criminal behind it all. If you got a dead body and you think his brother did it, you're gonna find out you're right. - Verbal, Usual Suspects") :Dragnet (ability :name "Dragnet" :reference "* Our fugitive has been on the run for ninety minutes. Average foot speed over uneven ground barring injuries is 4 miles-per-hour. That gives us a radius of six miles. What I want from each and every one of you is a hard-target search of every gas station, residence, warehouse, farmhouse, henhouse, outhouse and doghouse in that area. - The Fugitive" :summary "* Search a large area for a fugitive.") :Exile (ability :name "Exile") :Exonerate (ability :name "Exonerate") :Judgment (ability :name "Judgment" :reference "* I am the law! - Judge Dredd") :Precedent (ability :name "Precedent") :Prosecute (ability :name "Prosecute") "Scales of Justice" (ability :name "Scales of Justice") :Shakedown (ability :name "Shakedown" :reference "* How many times you been in a lineup? It's always you and four dummies. PD are paying homeless guys $10 a head half the time. And there's no way they'd line five felons in the same row. No way - Keaton, Usual Suspects") :Trial (ability :name "Trial"))) :Performance (skill :name "Performance" :reference "* Ahh, the denouement. - Jhin, Runeterra" :titles "Entertainer, Performer, Jester, Juggler" :stat "Spirit" :abilitymap (abilitymap :Allure (ability :name "Allure") :Amplify (ability :name "Amplify" :reference "These go to eleven. - This is Spinal Tap" :summary "* A performer must be able to be heard. This ability maximizes the acoustics available and allows the performer's message to be heard.") :Ballad (ability :name "Ballad") "Ballroom Dance" (ability :name "Ballroom Dance") "Break Dance" (ability :name "Break Dance") :Calm (ability :name "Calm" :titles "Pacify, Soothe the Savage") "Captivating Song" (ability :name "Captivating Song" :summary "* For each success, the targets Move is reduced by 1.") :Comedy (ability :name "Comedy" :titles "Clown, Comedian, Mime, Jester") :Crescendo (ability :name "Crescendo") :Dirge (ability :name "Dirge" :summary "* Opponents in Radius are cloaked in despair. * [Passive] * [Continuous]: [Retreats] are increased by 1 for all opponents within the radius." :titles "Demoralize, Song of Fear") :Discord (ability :name "Discord" :summary "* A sudden sound that disrupts the natural flow of existing sounds. * The secret to this skill is to pick the most inappropriate sound at the most inappropriate time. * The result is extremely distracting and will cancel other effects based on sound including other Communication abilities." :titles "Cacaphony") :Disguise (ability :name "Disguise") :Fanfare (ability :name "Fanfare" :summary "* A cheering audience increases an entertrainer's power.") "Gabriel's Horn" (ability :name "Gabriel's Horn" :summary "* [Requires]: Horn * Damages Walls of any kind") :Harmonize (ability :name "Harmonize") :Heartstrings (ability :name "Heartstrings" :reference "* Strumming my pain with his fingers. Singing my life with his words. Killing me softly with his song. Killing me softly with his song telling my whole life with his song. - The Fugees, Killing Me Softly") "Hip Hop Dance" (ability :name "Hip Hop Dance") :Imitation (ability :name "Imitation") :Impersonation (ability :name "Impersonation") :Incite (ability :name "Incite") :Inspiration (ability :name "Inspiration" :summary "* Allies in Radius are Continuously inspired to greater feats by this ability. * [Passive] * [Continuous]: [Retreats] are reduced by 1 for all allies within the radius.") :Juggling (ability :name "Juggling" :summary "* Besides juggling objects, this ability allows the user to catch objects. * [Reaction]: When an object is thrown at a space within one space of the user, roll vs. the [Attack], the object is caught if any [Hits] are scored. Further, the user may immediately throw the object using [Juggling] level as attack value.") :Lullaby (ability :name "Lullaby") "Performance Art" (ability :name "Performance Art" :reference "Cirque de Soleil") "Pole Dance" (ability :name "Pole Dance") :Requiem (ability :name "Requiem") "Salsa Dance" (ability :name "Salsa Dance") :Satirize (ability :name "Satirize") :Serenade (ability :name "Serenade") :Sexpertise (ability :name "Sexpertise" :reference "* If you don't like the company, let's just do it you and me...you and me...or three...or four, on the floor. - Britney Spears, Three") :Silence (ability :name "Silence") "Siren Song" (ability :name "Siren Song" :summary "* [Action]: For each success, during its turn, the target must use half of its [Move] to approach the singer.") :Speeches (ability :name "Speeches") :Song (ability :name "Song") :Storytelling (ability :name "Storytelling" :titles "Storyteller") :Style (ability :name "Style") :Tango (ability :name "Tango") :Waltz (ability :name "Waltz") "War Song" (ability :name "War Song" :reference "Battle Hymn, Glorious Anthem") "Work Song" (ability :name "Work Song")) :specialtymap (specialtymap :Courtesan (specialty :name "Courtesan" :reference "* Madame Kaji: We've been servicing the road-weary crotches of every man here to pay obeisance to your new family. You need service only one, freshly washed. Akemi: You don't understand. Madame Kaji: That he's a beast. He's weak. He's a man. All men are weak. The ones who act beastly are weakest. They penetrate women and think that makes them powerful. Really, their pricks are fragile. Exposed. You saw it yourself. They want to be diapered, spanked, and breastfed, then strut away like they conquered an army. Nurture his weakness. Be his strength, and he'll worship you. Akemi: I, don't know if I can. Madame Kaji: Stop running to and from men, and decide what you want for your fucking self. Akemi: I want to be in control of my life. Madame Kaji: Then take control of his, Princess - Madame Kaji and Akemi, Blue Eye Samurai" :summary "* A prostitute, especially one whose clients are members of a royal court or of high social standing.") :Dance (specialty :name "Dance" :summary "Ballroom Dance, Break Dance, Hip Hop Dance, Pole Dance, Salsa Dance, Tango, Waltz") :Music (specialty :name "Music" :summary "* Song, Musical Instrument * The power of music lies in its ability to tell truths that we willing listen to even if they are unpleasant. * See Equipment for Musical Instruments * Musical Instruments may be used with any performance power to increase any Range or Radius by 1 Space." :titles "Bard, Classical, Drummer, Guitarist, Harpist, Hip-Hop, Jazz, Lyrist, Minstrel, Musician, Piper, Pop, Rap, Rhapsode, Rock, Skald, Troubadour") :Acting (specialty :name "Acting" :reference "* Acting! - Master Thespian, Saturday Night Live" :titles "Drama Queen, Master Thespian, Theater Brat, Thespian"))) :Persuasion (skill :name "Persuasion" :titles "Fast Talker, Silver Tongue Devil, Smooth Operator" :abilitymap (abilitymap :Bluff (ability :name "Bluff") :Credibility (ability :name "Credibility" :summary "* The ability to convince large groups of people that you are telling the truth.") :Debate (ability :name "Debate") "Fast Talk" (ability :name "Fast Talk") :Lying (ability :name "Lying" :titles "Fibbing") :Manipulation (ability :name "Manipulation") :Pickup (ability :name "Pickup") :Seduction (ability :name "Seduction" :reference "* But what of all those sweet words you spoke in private? Oh that's just what we call pillow talk, baby, that's all. - Ash, Army of Darkness * But you don't understand. That men are weak? * Guess I must be dumb. She had a pocket full of horses, trojan and some of them used... I guess I should have closed my eyes when you drove me to the pace where your horses run free. Cause I felt a little ill when I saw all the pictures of the jockeys that were there before me. Believe it or not, I started to worry. I wondered if I had enough class. But it was Saturday night, I guess that makes it alright. And you say, Baby have you got enough gas? Oh, Yeah! - Prince, Little Red Corvette" :titles "Femme Fatale, Vamp") "Silver Tongue" (ability :name "Silver Tongue") "Swords to Plowshares" (ability :name "Swords to Plowshares" :summary "* Sincerly convince a rival to choose peace over conflict."))) "Social Sciences" (skill :name "Social Sciences" :abilitymap (abilitymap :Anthropology (ability :name "Anthropology" :summary "* The study of cultures, customs, habits, race, tribes, gangs, and other group affliations and interactions.") "Breaking Point" (ability :name "Breaking Point" :summary "* Determine psychological weaknesses (phobias, addictions, obsessions, etc.)") "Determine Motivation" (ability :name "Determine Motivation") :Philosophy (ability :name "Philosophy") :Profile (ability :name "Profile") :Psychoanalyze (ability :name "Psychoanalyze") :Psychology (ability :name "Psychology") :Sociology (ability :name "Sociology") :Teaching (ability :name "Teaching" :reference "* The true master is an eternal student. - Master Yi, Runeterra" :titles "Educator") :Theology (ability :name "Theology" :summary "* Knowledge about the history, customs, and objects of religions. Though the focus is on a particular religion, Theology includes some understanding of all religions."))) :Stealth (skill :name "Stealth" :titles "Stalker" :stat "Body" :abilitymap (abilitymap :Ambush (ability :name "Ambush") :Backstab (ability :name "Backstab" :summary "* [Action]: Gain [+1 Synergy] when [Flanking] target in Close Combat. * [Action]: Gain [+1 Synergy] per [Level] when in the target's Blind Spot in Close Combat." :titles "Back Biter, Back Stabber, Opportunist, Traitor") "Blend into the Crowd" (ability :name "Blend into the Crowd" :summary "* Attitude, Mannerism, and Appearance can often allow a stranger to go unnoticed in a crowd. * [Continuous]: While active, unit is hidden as long as at least 10 other units are within skill spaces.") :Camouflage (ability :name "Camouflage" :summary "* [Continuous]: While active, unit is hidden. * [Defense]: +1 Defense in [Terrain]. * [Roll]: Skill - Move this turn. * [Versus]: and others must roll Spirit - Terrain penalty vs to detect.") "Cloak and Dagger" (ability :name "Cloak and Dagger" :summary "* [Action]: Gains short term Stealth, move up to 2 spaces ignoring attacks of opportunity and attack with a [Knife] by [Surprise].") :Hide (ability :name "Hide" :summary "* Find a hiding place in an area where you will not normally be detected.") :Seek (ability :name "Seek" :summary "* Discover the location of someone using [Stealth]." :titles "Detect Stealth") :Sneak (ability :name "Sneak" :summary "* Move silently") "Sneak Attack" (ability :name "Sneak Attack" :titles "Suprise Attack") :Stalk (ability :name "Stalk" :summary "* The ability to move carefully to avoid detection. * [Requires]: No other action may be performed this turn. * [Action]: Move at half speed. Any attempt to act toward you, first requires an Mind vs. your skill or fail.") "Strike and Fade" (ability :name "Strike and Fade" :summary "* [Requires]: No other action may be performed this turn. * [Attack]: After this attack, if you have sufficient Move remaining, move 1 space.") :Tailing (ability :name "Tailing" :summary "* Subtly pursue someone. Ideally, you must stay as far away as possible without losing track of your quarry. Completely unaware people are easy to pursue. Paranoid targets will attempt to spot tailing and may attempt to evade tails even when they do not know they are being tailed.") "Without a Trace" (ability :name "Without a Trace"))))))))))
nx/tactics/books/skills / tacticsbook
Description:
Function Name:
  • tacticsbook
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func tacticsbook : base/book (book :name "Skills" :image "Skill.jpg" :chaptermap (chaptermap "Skills Overview" (chapter :name "Skills Overview" :sectionmap (sectionmap "Extraordinary Skills" (section :name "Extraordinary Skills" :reference "* What you call tao. It's a power everyone possesses innately, but mastering it allows one to achieve superhuman abilities... But you must be careful how you use it. Tao is life itself. Use too much, and you'll exhaust more than just your stamina... In the worst case, overuse likely leads to death. - Shion-dono , Hell's Paradise") "Why Tactics: Skills?" (section :name "Why Tactics: Skills?" :sectionmap (sectionmap "Extraordinary Skills" (section :name "Extraordinary Skills" :reference "* What you call tao. It's a power everyone possesses innately, but mastering it allows one to achieve superhuman abilities... But you must be careful how you use it. Tao is life itself. Use too much, and you'll exhaust more than just your stamina... In the worst case, overuse likely leads to death. - Shion-dono , Hell's Paradise"))))) "Skill Types" (chapter :name "Skill Types" :sectionmap (sectionmap "Social Skills" (section :name "Social Skills" :skillmap (skillmap :Art (skill :name "Art" :reference "* Art requires a certain... cruelty. - Jhin, Runeterra" :titles "Artist, Artisan" :stat "Spirit" :abilitymap (abilitymap "Art Imitates Life" (ability :name "Art Imitates Life" :reference "Dorian Gray" :summary "Artwork become real") :Calligraphy (ability :name "Calligraphy") :Crafts (ability :name "Crafts") :Drawing (ability :name "Drawing") :Painting (ability :name "Painting") :Photoshopping (ability :name "Photoshopping" :summary "* Modify an image to improve or mislead.") :Sculpture (ability :name "Sculpture"))) :Business (skill :name "Business" :reference "* Did they get you to trade? Your heroes for ghosts? Hot ashes for trees? Hot air for a cool breeze? Cold comfort for change? Did you exchange? A walk-on part in the war. For a leading role in a cage? - Pink Floyd, Wish you were here" :titles "Commerce" :abilitymap (abilitymap :Accounting (ability :name "Accounting" :titles "Accountant, Actuary, Clerk") :Advertising (ability :name "Advertising" :titles "Marketing Representative") :Appraise (ability :name "Appraise" :summary "* Determine the value of an item in the current market.") :Bargain (ability :name "Bargain" :summary "* Ability that Limits any attempt to buy or sell goods at their actual worth." :titles "Haggler, Merchant") :Barter (ability :name "Barter" :summary "* Ability that Limits any attempt to buy or sell goods at their actual worth.") "Business Management" (ability :name "Business Management") :Distribution (ability :name "Distribution") :Economics (ability :name "Economics" :reference "* In 5 minutes, you learn what the average University student remembers 5 years after learning school ... Economics: Supply and Demand. That's it. - Father Guido Sarducci, Five Minute University") :Finance (ability :name "Finance") :Marketing (ability :name "Marketing") :Procure (ability :name "Procure" :summary "The ability to find rare, exotic or illegal items for sale or trade." :titles "Procurer") :Sales (ability :name "Sales" :reference "* In 5 minutes, you learn what the average University student remembers 5 years after learning school ... Business is: You buy something, you sell it for more - Father Guido Sarducci, Five Minute University" :titles "Carpetbagger, Peddler, Salesman") :Speculate (ability :name "Speculate") "Trade Routes" (ability :name "Trade Routes") "Trade Union" (ability :name "Trade Union"))) :Communications (skill :name "Communications" :abilitymap (abilitymap :Appearance (ability :name "Appearance" :summary "* Expert on personal grooming, cosmetics, and hairstyling.") :Carousing (ability :name "Carousing") "Detect Lie" (ability :name "Detect Lie") :Drinking (ability :name "Drinking") :Drugs (ability :name "Drugs") :Etiquette (ability :name "Etiquette") :Fashion (ability :name "Fashion" :summary "* Knows current fashions and what clothing with make the best impact.") :Fiction (ability :name "Fiction" :summary "* Can author, critique, interpret, and detect fiction.") "Go Viral" (ability :name "Go Viral" :summary "* Create an interesting message popular enough to be passed around.") :Gossip (ability :name "Gossip" :summary "* The single best way to get information, but, given it source, may not be reliable.") :Interview (ability :name "Interview" :titles "Interviewer, Reporter") :Journalism (ability :name "Journalism" :titles "Journalist, Media, Reporter") :Literacy (ability :name "Literacy" :summary "* Can read and write * This ability is assumed in modern characters from 1st and 2nd world nations") "Motivational Speaking" (ability :name "Motivational Speaking" :reference "* My name is Matt Foley and I am a motivational speaker... First off, I am thirty-five years old, I am divorced, and I live in a van down by the river... Well I'm here to tell you, that you're probably going to find out, as you go out there, that you're not going to amount to jack squat! You're going to end up eating a steady diet of government cheese and living in a van down by the river! - Matt Foley, SNL" :titles "Motivational Speaker") :Negotiation (ability :name "Negotiation" :titles "Advisor, Arbiter, Diplomat, Emissary, Envoy, Legate, Negotiator") :Photography (ability :name "Photography" :titles "Photographer") :Poetry (ability :name "Poetry" :summary "Can author any type of poetry" :titles "Poet") :Politics (ability :name "Politics") :Recruiting (ability :name "Recruiting" :titles "Casting Director, Hiring Manager, Recruiter") :Scribe (ability :name "Scribe" :summary "* Can copy writings exactly") :Sincerity (ability :name "Sincerity" :summary "* Helps convince others when you are being truthful. * Helps improve long term relationships by increasing trust. * Limitation - May only be used when you truly believe that your are correct.") "Small Talk" (ability :name "Small Talk" :titles "The Gift of Gab") :Streetwise (ability :name "Streetwise" :summary "* [Action]: Gain knowledge where a good or service can be found in a city including black market goods or services.") :Translator (ability :name "Translator" :summary "* Can translate immediately") "Trash Talk" (ability :name "Trash Talk" :reference "* What's the matter Agent Scary Lips? You're Scary Lips tasting my hairy shit? You tasting Doug Wilson's World Famous beef stew? How's it going down, its kinda spicy right? You guys are so fucked right now, all I can think about is your wife and a horse. - Doug Wilson, Weeds" :titles "Put Down") :Videography (ability :name "Videography" :titles "Cameraman, Videographer") "Video Production" (ability :name "Video Production" :titles "Director, Producer") "Wise Words" (ability :name "Wise Words" :summary "* Apply personal life experiences to help others understand themselves.") :Cantonese (ability :name "Cantonese") :English (ability :name "English") :French (ability :name "French") :German (ability :name "German") :Greek (ability :name "Greek") :Italian (ability :name "Italian") :Latin (ability :name "Latin") :Mandarin (ability :name "Mandarin") "Olde English" (ability :name "Olde English") :Portuguese (ability :name "Portuguese") :Russian (ability :name "Russian") "Sign Language" (ability :name "Sign Language") :Spanish (ability :name "Spanish")) :specialtymap (specialtymap :Linguistics (specialty :name "Linguistics" :reference "* So we put her on the hit list, of a common, cunning linguist: a master of many tongues. - Deep Purple, Knocking at Your Backdoor" :summary "* Philosophy - The 'common tongue' concept is boring and unrealistic. * Simulate the limitations of language by reducing usable vocabulary. This can be done by limiting a conversation to 2, 3, 4, or 5 letter words depending on the fluency of those involved. Having a conversation using only 2 letter words is going to require a fair amount of hand gesturing or drawing to get a point across. If a person is overhearing a conversation, bleep out the big words and let them guess at the missing words.") :Writing (specialty :name "Writing"))) :Crime (skill :name "Crime" :titles "Bandit, Brigand, Crime Boss, Crook, Cutthroat, Highwayman, Pimp, Yakuza, Yakuza - Oyabun" :stat "Shadow" :abilitymap (abilitymap "Armed Robbery" (ability :name "Armed Robbery") :Blackmail (ability :name "Blackmail") :Bribery (ability :name "Bribery") "Crime Syndicate" (ability :name "Crime Syndicate") "Crime Wave" (ability :name "Crime Wave") "Criminal Mastermind" (ability :name "Criminal Mastermind") :Extortion (ability :name "Extortion") "Fence Goods" (ability :name "Fence Goods") :Kidnapping (ability :name "Kidnapping") "Mafia Connections" (ability :name "Mafia Connections") :Pimping (ability :name "Pimping") :Piracy (ability :name "Piracy" :summary "* Armed robbery of large shipments of goods without damaging the merchandise.") :Prostitution (ability :name "Prostitution") :Rustling (ability :name "Rustling" :summary "* Stealing and selling livestock") :Waylay (ability :name "Waylay"))) :Deception (skill :name "Deception" :reference "* I whisper Truth, into Lies... - Leblanc, Runeterra" :titles "Chicanery, Legerdemain" :stat "Shadow" :abilitymap (abilitymap :Burglary (ability :name "Burglary") "Con Artist" (ability :name "Con Artist") "Confidence Game" (ability :name "Confidence Game" :titles "Con Artist, Swindler") :Decoy (ability :name "Decoy" :summary "* Create a decoy to mislead. * [Move]: Remove this unit from play and place 1 Decoy Token and 1 Decoy Unit Token on this unit's space. Both decoys may act normally during the Action phase, but any action but movement will dispel the decoys. Both decoys defend as the original unit. If either unit is Hit, both decoys are dispelled. The decoys last until the next turn or until dispelled.") "Detect Trap" (ability :name "Detect Trap") :Distraction (ability :name "Distraction" :titles "Throw Dirt") :Escape (ability :name "Escape" :reference "* The chain in those handcuffs is high-tensile steel. It'd take you ten minutes to hack through it with this. Now, if you're lucky, you could hack through your ankle in five minutes. Go." :summary "* The ability comes from extensive practice escaping from various bonds and confinements. At higher abilities, the user can dislocate joints to slither out of bonds." :titles "Escape Artist") "Evade Pursuit" (ability :name "Evade Pursuit" :summary "* Ability to correctly evaluate the opponent's pursuit style and outwit the pursuer.") :Forgery (ability :name "Forgery" :summary "* The ability to forge money or documents. This ability is also used while creating money to prevent forgery. * [Extended Action]: Roll vs. object quality or anti-forgery level. Any [Hits] allow a forgery that can pass at a distance. The more [Hits] and [Criticals] rolled, the more indistinquishable from the original. High level forgeries are works of art unto themselves.") :Gambling (ability :name "Gambling" :titles "Gambler, High Roller") "Honor Among Thieves" (ability :name "Honor Among Thieves") :Misdirection (ability :name "Misdirection") "Pick Pockets" (ability :name "Pick Pockets") "Sleight of Hand" (ability :name "Sleight of Hand" :summary "* Hide a small object in hand without being noticed." :titles "Legerdemain") :Smuggling (ability :name "Smuggling") "Stage Magic" (ability :name "Stage Magic") "Thieves Guild Codes" (ability :name "Thieves Guild Codes" :summary "Thieves must conceal their illegal conversations and the guilds have developed a shifting series of hand signals, marks, and code words to communicate simple concepts without arising suspiscion.") "Use Blinding Powder" (ability :name "Use Blinding Powder") "Use Flash Powder" (ability :name "Use Flash Powder") "Use Irritating Powder" (ability :name "Use Irritating Powder") "Use Sleeping Powder" (ability :name "Use Sleeping Powder") :Vanish (ability :name "Vanish") :Ventriloquism (ability :name "Ventriloquism")) :specialtymap (specialtymap :Thievery (specialty :name "Thievery" :reference "This is where Forrestall cashed in. A friend of yours? A competitor... he was good. He was very good. - Indiana Jones, Raiders of the Lost Ark" :summary "* Burglary, Escape, Fence Goods, Honor Among Thieves, Pick Pockets, Smuggling, Thieves Guild Codes" :titles "Burglar, Cutpurse, Footpad, Nezumi kozo, Pick Pocket, Smuggler, Thief") :Trickery (specialty :name "Trickery" :summary "* Blinding Powder, Confidence Game, Decoy, Distraction, Flash Powder, Gambling, Irritating Powder, Misdirection, Sleight of Hand, Stage Magic, Swindling, Vanish, Ventriloquism" :titles "Blackguard, Caitiff, Charlatan, Con Artist, Delinquent, Gambler, Knave, Ne'er do well, Ninja, Rapscallion, Renegade, Riffraff, Rogue, Scoundrel, Scalawag, Stage Magician, Swashbuckler, Swindler, Trickster"))) :Espionage (skill :name "Espionage" :titles "Covert Ops, Infiltrator, Informer, Spy, Traitor" :stat "Shadow" :abilitymap (abilitymap :Counterintelligence (ability :name "Counterintelligence") "Cyber Intelligence" (ability :name "Cyber Intelligence" :summary "* Intelligence gathered from computer networks." :titles "CYBINT, DNINT, Digital Network Intelligence") :Eavesdrop (ability :name "Eavesdrop" :summary "* Listen in to conversations without being detected.") :Infiltrate (ability :name "Infiltrate" :summary "* [Defense] - Mind * [Deploy] - Deploy this unit in waiting area. * [Action] - Replace any non-unique unit with this unit.") "Geospatial Intelligence" (ability :name "Geospatial Intelligence" :summary "* Intelligence gathered from satellite, aerial photography, mapping. * Espionage, Diplomats, Military Attaches, NGOs, Patrolling, POWs Detainees, Refugees, Strategic Reconnaissance, Traveller Debriefing" :titles "GEOINT, IMINT, Imagery Intelligence") "Human Intelligence" (ability :name "Human Intelligence" :summary "* Intelligence gathered from a person on the ground. * Espionage, Diplomats, Military Attaches, NGOs, Patrolling, POWs Detainees, Refugees, Strategic Reconnaissance, Traveller Debriefing" :titles "HUMINT") "Intelligence Network" (ability :name "Intelligence Network" :reference "If you thought there was some secret cell somewhere working Al Qaedia. Then I want you to know you're wrong. This it it. There is no working group coming to the rescue. There is nobody else hidden on some other floor. There is just us... and we are failing!... They murdered 3000 of our citizens..in cold-blood and they have slaughtered our forward deploy. And what the fuck have we done about it, huh? What have we done?! We have 20 leadership names. We have only eliminated 4 of them. I want targets. Do your fucking jobs. Bring me people to kill. - Zero Dark Thirty") "Lip Reading" (ability :name "Lip Reading" :summary "* Attempt to understand what is being said without the benefit of hearing. The more [Hits] rolled, the more accurate the interpretation.") "Measurement and Signals" (ability :name "Measurement and Signals" :summary "* Intelligence gathered from the signatures (distinctive characteristics) of fixed or dynamic target sources. This includes radar, acoustic, nuclear, chemical, and biological intelligence." :titles "MASINT") :Misdirection (ability :name "Misdirection" :reference "* Smoke and Mirrors... Classic Misdirection - Leblanc, Runeterra") "Open Source Intelligence" (ability :name "Open Source Intelligence" :summary "* Intelligence gathered from open sources." :titles "OSINT") :Propaganda (ability :name "Propaganda") "Quick Change" (ability :name "Quick Change") :Sabotage (ability :name "Sabotage" :titles "Saboteur") "Signals Intelligence" (ability :name "Signals Intelligence" :reference "* Quiller" :summary "* Intelligence gathered from interception of signals." :titles "SIGINT, Signals") :Subversion (ability :name "Subversion") "Technical Intelligence" (ability :name "Technical Intelligence" :summary "* Intelligence gathered from analysis of weapons and equipment." :titles "TECHINT") "Whispering Campaign" (ability :name "Whispering Campaign"))) :Faith (skill :name "Faith" :reference "The argument goes something like this: 'I refuse to prove that I exist,' says God, 'for proof denies faith, and without faith I am nothing.' 'But,' says Man, 'The Babel fish is a dead giveaway, isn't it? It could not have evolved by chance. It proves you exist, and so therefore, by your own arguments, you don't. QED.' - Hitchhiker's Guide to the Galaxy" :titles "Abbot, Absolver, Archbishop, Bishop, Cardinal, Cleric, Ceremonial Guard, Gakusho, Missionary, Paladin, Priest, Redeemer, Sin Eater, Theologist, Theurge, Theurgy" :abilitymap (abilitymap :Absolution (ability :name "Absolution") :Affirmation (ability :name "Affirmation" :summary "An affirmation is a statement designed to have a positive effect on the conscious mind when repeated at frequent intervals throughout meditation ritual spells.") :Atonement (ability :name "Atonement") :Blessing (ability :name "Blessing" :summary "* A simple incantation with a variety of subtle effects. * [Action]: Touch. Target gains a new Blessing Token (max 1). At any time, the target may remove the token and gain +1 on any Defense roll. * [Duration]: up to 1 day/level.") :Chant (ability :name "Chant" :summary "* Aura: All Allies with same Religion within level spaces receive +1 on Defense rolls.") :Confession (ability :name "Confession") :Consecration (ability :name "Consecration" :summary "* To consecrate is to solemnly dedicate or devote something or someone to a sacred purpose, to cleanse and protect.") :Contemplation (ability :name "Contemplation" :summary "* Contemplation is a focused and disiplined form of contemplation or reflecting, whereby one is able to alter an emotional state and to receive self-insight.") :Conversion (ability :name "Conversion") :Dedication (ability :name "Dedication" :summary "* [Death]: Unit enters specified Deity's realm. It is not substantiated that this ability actually works. Those who have crossed over are changed and may not and will not return.") :Drumming (ability :name "Drumming" :summary "* Drumming is literally pounding on a surface. This is used to raise power and to change emotional states.") :Excommunication (ability :name "Excommunication") :Initiation (ability :name "Initiation" :summary "* Used to describe the profound spiritual experience that occurs when one's unity with Deity and the Universe is realised; when one is welcomed as a fully-fledged member of a particular group; and the celebration of a successful ritual.") :Marriage (ability :name "Marriage") :Mass (ability :name "Mass") :Namegiving (ability :name "Namegiving") :Ordainment (ability :name "Ordainment") :Redemption (ability :name "Redemption") :Sacrament (ability :name "Sacrament") :Salvation (ability :name "Salvation") :Sanctify (ability :name "Sanctify") "Sin Eating" (ability :name "Sin Eating" :summary "* A willing subject may describe his dark desires, the Sin Eater then repeats the description replacing references to the subject with himself. After the ritual is complete, the subject will not feel the urges so strongly. Instead the Sin Eater will feel those emotions. If he acts on them, even symbolically, his [Shadow] gains power. If he can resolve them, he gains experience."))) :Influence (skill :name "Influence" :reference "* Many men, of course, became extremely rich, and this was perfectly natural and nothing to be ashamed of because no one was really poor, at least no one worth speaking of. - Hitchhiker's Guide to the Galaxy" :titles "Aristocrat, Baron, Baroness, Baronet, Celebrity, Count, Countess, Daimyo, Dame, Duchess, Duke, Emperor, Empress, King, Knight, Lord, Marchioness, Marquis, Matriarch, Monarch, Patriarch, Pontif, Prince, Princess, Queen, Regina, Sire, Sovereign, Star" :abilitymap (abilitymap "Black Market Ties" (ability :name "Black Market Ties") :Boon (ability :name "Boon") :Business (ability :name "Business") "Carte Blanche" (ability :name "Carte Blanche" :titles "Blank Check") "Corporate Ties" (ability :name "Corporate Ties") "Entertainment Ties" (ability :name "Entertainment Ties") :Fame (ability :name "Fame" :summary "* Your reputation precedes you. People are drawn to the famous and will often do extraordinary things to be near them. * [Synergy]: [Seduction] * [Action]: Leverage your fame to gain minor free goods or services including upgraded lodging, free meals, audience with nobles, etc.") "Family Ties" (ability :name "Family Ties") :Fortune (ability :name "Fortune") :Followers (ability :name "Followers" :titles "Acolyte, Apprentice, Retinue, Servant, Serf, Shieldbearer") "Friends in High Places" (ability :name "Friends in High Places" :reference "* I'm telling you this guy is protected from up on high by the Prince of Darkness. - Jeff Rabin, Usual Suspects") :Infamy (ability :name "Infamy" :summary "* Your dark reputation precedes you. People are intrigued by the infamous and will often do extraordinary things in fear and facination of them. * [Synergy]: [Intimidation] * [Action]: Leverage your infamy to gain minor free goods or services including upgraded lodging, free meals, etc.") :Intrigue (ability :name "Intrigue") :Investing (ability :name "Investing") "Judicial Ties" (ability :name "Judicial Ties") "Law Enforcement Ties" (ability :name "Law Enforcement Ties") "License to Kill" (ability :name "License to Kill") :Mansion (ability :name "Mansion") "Media Ties" (ability :name "Media Ties") "Night Club" (ability :name "Night Club") "Noble Birth" (ability :name "Noble Birth") "Official Title" (ability :name "Official Title") "Political Ties" (ability :name "Political Ties" :titles "Ambassador, Minister, Politician, Senator") "Religious Ties" (ability :name "Religious Ties") "Train Follower" (ability :name "Train Follower") "Underworld Ties" (ability :name "Underworld Ties") :Windfall (ability :name "Windfall")) :specialtymap (specialtymap :Nobility (specialty :name "Nobility" :titles "Noble Lineage") :Royalty (specialty :name "Royalty" :titles "Royal Lineage"))) :Intimidation (skill :name "Intimidation" :reference "* I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path. Where the fear has gone there will be nothing. Only I will remain. - Bene Gesserit Litany, Dune * They tell him they want his territory: all his business. Soze looks over the faces of his family, then he showed these men of will what will really was. He tells him he would rather see his family dead, than live another day after this. ... He waits until his wife and kids are in the ground, and then he goes after the rest of the mob. He kills their kids. He kills their wives. He kills their parents and their parents friends. He burns down the houses they live in and the stores they work in. He kills people who owe them money. And like that, he's gone. - Verbal Kint, Usual Suspects" :titles "Demagogue, Enforcer, Fearmonger, Overseer, Pimp, Slave Lord, Slaver, Tormentor, Torturer" :stat "Shadow" :abilitymap (abilitymap :Coercion (ability :name "Coercion" :reference "* The boat will be ready for you on Friday. If I see you or any of your friends before then, Miss. Finneran will find herself the victim of a most gruesome violation before she dies. As will your father, Mr. Hockney, and your Uncle Randall in Arizona, Mr. Kint. I might only castrate Mr. McManus's nephew, David. Do I make myself clear? - Kobayashi, Usual Suspects") "Death March" (ability :name "Death March" :summary "* Increase movement of allies within level spaces. Sustained use of this ability runs the risk of injuring or killing some allies.") :Duress (ability :name "Duress") :Enslave (ability :name "Enslave" :reference "Did you know that pain causes the formation of the strongest chemical bonds in the mammalian brain? Whip a dog, and it keeps coming back... At first it will hope that you'll stop, but after a while, it won't even know the difference. But you already know all about that don't you?... Time melted away into the pain... Finally something clicked over in his head and reality rushed back in around him, clearer and sharper than ever before... Staring he made out faces. Faces not unlike his own reflection he had seen only an eternity ago. Faces distended in howling agony... eyes welling with tears of blood, eyes that all turned toward Her, crying in admiration. - Mage: The Book of Madness") "Grip of Fear" (ability :name "Grip of Fear" :reference "* It was Keyser Soze, Agent Kujan. I mean the Devil himself. How do you shoot the devil in the back? What if you miss? - Verbal, Usual Suspects") :Interrogate (ability :name "Interrogate" :reference "* I'm gonna ask you one more goddamn time, and if you still 'respectfully refuse,' I'm callin' the Bear Jew over here, and he's gonna take that big-ole bat of his, and he's gonna beat you to death with it. Now take your wiener schnitzel lickin' finger and point out on this map what I want to know...We got a German here who wants to die for his country! Oblige him! - Lt. Aldo Raine, Inglourious Basterds * You don't need that. I'll tell you everything. Yes...I know you will. - Raiders of the Lost Ark") :Intimidate (ability :name "Intimidate" :reference "* Your timing is impeccable. Pity you were all they sent... The Fatui would do well to update their intelligence concerning me. Ah, but of course, that would require one of you to return in one piece. - Ayato, Genshin Impact * ...to the death. No. To the pain. I don't think I'm quite familiar with that phrase. ... To the pain means the first thing you will lose will be your feet below the ankles. Then your hands at the wrists. Next your nose. ...And then my ears, I understand let's get on with it. WRONG. Your ears you keep and I'll tell you why. So that every shriek of every child at seeing your hideousness will be yours to cherish. Every babe that weeps at your approach, every woman who cries out, 'Dear God! What is that THING?,' will echo in your perfect ears. That is what to the pain means. It means I leave you in anguish, wallowing in freakish misery ... forever. ...I think you're bluffing. It's possible, Pig, I might be bluffing. It's conceivable, you miserable, vomitous mass, that I'm only lying here because I lack the strength to stand. But, then again... perhaps I have the strength after all. - Princess Bride" :summary "* A form of bluffing") "Reign of Terror" (ability :name "Reign of Terror" :summary "* Use to rally troops") :Terrorize (ability :name "Terrorize" :summary "* [Attack]: Any [Critical Hits] may be [Retreats]") :Torment (ability :name "Torment") :Torture (ability :name "Torture" :reference "* Your cries of agony, where will they not reach? Where on Citaeron will they not re-echo? No man living will meet a doom more terrible than yours. - Sophocles, Oedipus Rex"))) :Law (skill :name "Law" :titles "Bailiff, Constable, Executioner, Judge, Lawbringer, Lawyer, Litigant, Magistrate, Peace Officer, Peacekeeper, Police Officer" :stat "Mind" :abilitymap (abilitymap :Authority (ability :name "Authority") "Blind Justice" (ability :name "Blind Justice") "Call In Backup" (ability :name "Call In Backup" :summary "Bring me everyone. What do you mean 'everyone'? E-V-E-R-Y-O-N-E! - Stansfield and Benny - Leon the Professional") :Condemn (ability :name "Condemn") :Confiscate (ability :name "Confiscate") "Crime and Punishment" (ability :name "Crime and Punishment") "Crowd Control" (ability :name "Crowd Control") "Detective Work" (ability :name "Detective Work" :reference "* To a cop the explanation is never that complicated. It's always simple. There's no mystery to the street, no arch criminal behind it all. If you got a dead body and you think his brother did it, you're gonna find out you're right. - Verbal, Usual Suspects") :Dragnet (ability :name "Dragnet" :reference "* Our fugitive has been on the run for ninety minutes. Average foot speed over uneven ground barring injuries is 4 miles-per-hour. That gives us a radius of six miles. What I want from each and every one of you is a hard-target search of every gas station, residence, warehouse, farmhouse, henhouse, outhouse and doghouse in that area. - The Fugitive" :summary "* Search a large area for a fugitive.") :Exile (ability :name "Exile") :Exonerate (ability :name "Exonerate") :Judgment (ability :name "Judgment" :reference "* I am the law! - Judge Dredd") :Precedent (ability :name "Precedent") :Prosecute (ability :name "Prosecute") "Scales of Justice" (ability :name "Scales of Justice") :Shakedown (ability :name "Shakedown" :reference "* How many times you been in a lineup? It's always you and four dummies. PD are paying homeless guys $10 a head half the time. And there's no way they'd line five felons in the same row. No way - Keaton, Usual Suspects") :Trial (ability :name "Trial"))) :Performance (skill :name "Performance" :reference "* Ahh, the denouement. - Jhin, Runeterra" :titles "Entertainer, Performer, Jester, Juggler" :stat "Spirit" :abilitymap (abilitymap :Allure (ability :name "Allure") :Amplify (ability :name "Amplify" :reference "These go to eleven. - This is Spinal Tap" :summary "* A performer must be able to be heard. This ability maximizes the acoustics available and allows the performer's message to be heard.") :Ballad (ability :name "Ballad") "Ballroom Dance" (ability :name "Ballroom Dance") "Break Dance" (ability :name "Break Dance") :Calm (ability :name "Calm" :titles "Pacify, Soothe the Savage") "Captivating Song" (ability :name "Captivating Song" :summary "* For each success, the targets Move is reduced by 1.") :Comedy (ability :name "Comedy" :titles "Clown, Comedian, Mime, Jester") :Crescendo (ability :name "Crescendo") :Dirge (ability :name "Dirge" :summary "* Opponents in Radius are cloaked in despair. * [Passive] * [Continuous]: [Retreats] are increased by 1 for all opponents within the radius." :titles "Demoralize, Song of Fear") :Discord (ability :name "Discord" :summary "* A sudden sound that disrupts the natural flow of existing sounds. * The secret to this skill is to pick the most inappropriate sound at the most inappropriate time. * The result is extremely distracting and will cancel other effects based on sound including other Communication abilities." :titles "Cacaphony") :Disguise (ability :name "Disguise") :Fanfare (ability :name "Fanfare" :summary "* A cheering audience increases an entertrainer's power.") "Gabriel's Horn" (ability :name "Gabriel's Horn" :summary "* [Requires]: Horn * Damages Walls of any kind") :Harmonize (ability :name "Harmonize") :Heartstrings (ability :name "Heartstrings" :reference "* Strumming my pain with his fingers. Singing my life with his words. Killing me softly with his song. Killing me softly with his song telling my whole life with his song. - The Fugees, Killing Me Softly") "Hip Hop Dance" (ability :name "Hip Hop Dance") :Imitation (ability :name "Imitation") :Impersonation (ability :name "Impersonation") :Incite (ability :name "Incite") :Inspiration (ability :name "Inspiration" :summary "* Allies in Radius are Continuously inspired to greater feats by this ability. * [Passive] * [Continuous]: [Retreats] are reduced by 1 for all allies within the radius.") :Juggling (ability :name "Juggling" :summary "* Besides juggling objects, this ability allows the user to catch objects. * [Reaction]: When an object is thrown at a space within one space of the user, roll vs. the [Attack], the object is caught if any [Hits] are scored. Further, the user may immediately throw the object using [Juggling] level as attack value.") :Lullaby (ability :name "Lullaby") "Performance Art" (ability :name "Performance Art" :reference "Cirque de Soleil") "Pole Dance" (ability :name "Pole Dance") :Requiem (ability :name "Requiem") "Salsa Dance" (ability :name "Salsa Dance") :Satirize (ability :name "Satirize") :Serenade (ability :name "Serenade") :Sexpertise (ability :name "Sexpertise" :reference "* If you don't like the company, let's just do it you and me...you and me...or three...or four, on the floor. - Britney Spears, Three") :Silence (ability :name "Silence") "Siren Song" (ability :name "Siren Song" :summary "* [Action]: For each success, during its turn, the target must use half of its [Move] to approach the singer.") :Speeches (ability :name "Speeches") :Song (ability :name "Song") :Storytelling (ability :name "Storytelling" :titles "Storyteller") :Style (ability :name "Style") :Tango (ability :name "Tango") :Waltz (ability :name "Waltz") "War Song" (ability :name "War Song" :reference "Battle Hymn, Glorious Anthem") "Work Song" (ability :name "Work Song")) :specialtymap (specialtymap :Courtesan (specialty :name "Courtesan" :reference "* Madame Kaji: We've been servicing the road-weary crotches of every man here to pay obeisance to your new family. You need service only one, freshly washed. Akemi: You don't understand. Madame Kaji: That he's a beast. He's weak. He's a man. All men are weak. The ones who act beastly are weakest. They penetrate women and think that makes them powerful. Really, their pricks are fragile. Exposed. You saw it yourself. They want to be diapered, spanked, and breastfed, then strut away like they conquered an army. Nurture his weakness. Be his strength, and he'll worship you. Akemi: I, don't know if I can. Madame Kaji: Stop running to and from men, and decide what you want for your fucking self. Akemi: I want to be in control of my life. Madame Kaji: Then take control of his, Princess - Madame Kaji and Akemi, Blue Eye Samurai" :summary "* A prostitute, especially one whose clients are members of a royal court or of high social standing.") :Dance (specialty :name "Dance" :summary "Ballroom Dance, Break Dance, Hip Hop Dance, Pole Dance, Salsa Dance, Tango, Waltz") :Music (specialty :name "Music" :summary "* Song, Musical Instrument * The power of music lies in its ability to tell truths that we willing listen to even if they are unpleasant. * See Equipment for Musical Instruments * Musical Instruments may be used with any performance power to increase any Range or Radius by 1 Space." :titles "Bard, Classical, Drummer, Guitarist, Harpist, Hip-Hop, Jazz, Lyrist, Minstrel, Musician, Piper, Pop, Rap, Rhapsode, Rock, Skald, Troubadour") :Acting (specialty :name "Acting" :reference "* Acting! - Master Thespian, Saturday Night Live" :titles "Drama Queen, Master Thespian, Theater Brat, Thespian"))) :Persuasion (skill :name "Persuasion" :titles "Fast Talker, Silver Tongue Devil, Smooth Operator" :abilitymap (abilitymap :Bluff (ability :name "Bluff") :Credibility (ability :name "Credibility" :summary "* The ability to convince large groups of people that you are telling the truth.") :Debate (ability :name "Debate") "Fast Talk" (ability :name "Fast Talk") :Lying (ability :name "Lying" :titles "Fibbing") :Manipulation (ability :name "Manipulation") :Pickup (ability :name "Pickup") :Seduction (ability :name "Seduction" :reference "* But what of all those sweet words you spoke in private? Oh that's just what we call pillow talk, baby, that's all. - Ash, Army of Darkness * But you don't understand. That men are weak? * Guess I must be dumb. She had a pocket full of horses, trojan and some of them used... I guess I should have closed my eyes when you drove me to the pace where your horses run free. Cause I felt a little ill when I saw all the pictures of the jockeys that were there before me. Believe it or not, I started to worry. I wondered if I had enough class. But it was Saturday night, I guess that makes it alright. And you say, Baby have you got enough gas? Oh, Yeah! - Prince, Little Red Corvette" :titles "Femme Fatale, Vamp") "Silver Tongue" (ability :name "Silver Tongue") "Swords to Plowshares" (ability :name "Swords to Plowshares" :summary "* Sincerly convince a rival to choose peace over conflict."))) "Social Sciences" (skill :name "Social Sciences" :abilitymap (abilitymap :Anthropology (ability :name "Anthropology" :summary "* The study of cultures, customs, habits, race, tribes, gangs, and other group affliations and interactions.") "Breaking Point" (ability :name "Breaking Point" :summary "* Determine psychological weaknesses (phobias, addictions, obsessions, etc.)") "Determine Motivation" (ability :name "Determine Motivation") :Philosophy (ability :name "Philosophy") :Profile (ability :name "Profile") :Psychoanalyze (ability :name "Psychoanalyze") :Psychology (ability :name "Psychology") :Sociology (ability :name "Sociology") :Teaching (ability :name "Teaching" :reference "* The true master is an eternal student. - Master Yi, Runeterra" :titles "Educator") :Theology (ability :name "Theology" :summary "* Knowledge about the history, customs, and objects of religions. Though the focus is on a particular religion, Theology includes some understanding of all religions."))) :Stealth (skill :name "Stealth" :titles "Stalker" :stat "Body" :abilitymap (abilitymap :Ambush (ability :name "Ambush") :Backstab (ability :name "Backstab" :summary "* [Action]: Gain [+1 Synergy] when [Flanking] target in Close Combat. * [Action]: Gain [+1 Synergy] per [Level] when in the target's Blind Spot in Close Combat." :titles "Back Biter, Back Stabber, Opportunist, Traitor") "Blend into the Crowd" (ability :name "Blend into the Crowd" :summary "* Attitude, Mannerism, and Appearance can often allow a stranger to go unnoticed in a crowd. * [Continuous]: While active, unit is hidden as long as at least 10 other units are within skill spaces.") :Camouflage (ability :name "Camouflage" :summary "* [Continuous]: While active, unit is hidden. * [Defense]: +1 Defense in [Terrain]. * [Roll]: Skill - Move this turn. * [Versus]: and others must roll Spirit - Terrain penalty vs to detect.") "Cloak and Dagger" (ability :name "Cloak and Dagger" :summary "* [Action]: Gains short term Stealth, move up to 2 spaces ignoring attacks of opportunity and attack with a [Knife] by [Surprise].") :Hide (ability :name "Hide" :summary "* Find a hiding place in an area where you will not normally be detected.") :Seek (ability :name "Seek" :summary "* Discover the location of someone using [Stealth]." :titles "Detect Stealth") :Sneak (ability :name "Sneak" :summary "* Move silently") "Sneak Attack" (ability :name "Sneak Attack" :titles "Suprise Attack") :Stalk (ability :name "Stalk" :summary "* The ability to move carefully to avoid detection. * [Requires]: No other action may be performed this turn. * [Action]: Move at half speed. Any attempt to act toward you, first requires an Mind vs. your skill or fail.") "Strike and Fade" (ability :name "Strike and Fade" :summary "* [Requires]: No other action may be performed this turn. * [Attack]: After this attack, if you have sufficient Move remaining, move 1 space.") :Tailing (ability :name "Tailing" :summary "* Subtly pursue someone. Ideally, you must stay as far away as possible without losing track of your quarry. Completely unaware people are easy to pursue. Paranoid targets will attempt to spot tailing and may attempt to evade tails even when they do not know they are being tailed.") "Without a Trace" (ability :name "Without a Trace"))))))))))
nx/tactics/books/space_and_time
Description:
Package Name:
  • nx/tactics/books/space_and_time
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
Functions:
  • tacticsbook
Source Code:
  • (package nx/tactics/books/space_and_time :libs (lib base :path nx/tactics/base)) (func tacticsbook : base/book (book :name "Space and Time" :image "Space.jpg" :chaptermap (chaptermap "Space and Time Overview" (chapter :name "Space and Time Overview" :sectionmap (sectionmap "Why Tactics: Space and Time?" (section :name "Why Tactics: Space and Time?" :summary "* Space is deadly to any normal lifeforms. * Militarily space represents the ultimate high ground. Anyone in orbit can see everything below and can reach any place on a planet in minutes."))) "Space Travel" (chapter :name "Space Travel" :sectionmap (sectionmap "Space Travel Rules" (section :name "Space Travel Rules" :rulemap (rulemap "Planetary Gravity" (rule :name "Planetary Gravity" :summary "* Microgravity - 0G to .2G - Microgravity only exists in space and on moons. Low gravity favors the development of tall, slight frames who will have much difficulty in 1G environments. Worlds with such low gravities do not maintain an atmosphere. * Very Low Gravity - .2G to .5G - Very Low gravity exists on small planets and large moons. Low gravity favors the development of tall, slight frames who will have difficulty in 1G environments. Worlds with such low gravities do not maintain an atmosphere. * Low Gravity - .5G to .8G - Low exists on smaller planets. Low gravity favors the development of tall frames. Worlds with low gravities will have thin atmospheres and consequently be exposed to higher levels of radiation. * Terran Gravity - .8G to 1.2G * High Gravity - 1.2G to 1.5G - High gravity exists on larger planets. High gravity favors short, heavy frames. * Very High Gravity - 1.5G to 2.5G - Very high gravity exists on larger planets. Very high gravity favors short, heavy frames. * Intense Gravity - 1.8G to 2.5G - Intense gravity exists on gas giant planets like Jupiter. Few creatures can survive such extreme gravity where the atmosphere is extremely dense. * Extreme Gravity - 2.5G+ - Extreme gravity exists on stars like the Sun (28G) with the extreme end being a Neutron star (300,000,000,000G) or a black hole.") "Planetary Atmosphere" (rule :name "Planetary Atmosphere" :summary "* Micropressure - 0 to .5 atmospheres - Micropressure only exists in space and even on Terran-sized planets (such as Mars). Most creatures cannot survive such low pressure. * Low Pressure - .5 to .8 atmospheres - Low pressure can exist on Terran-sized planets and very large moons. Low pressure favors the development of expanded lung capacity and relative resistance to hypoxia. Conversely such creatures struggle when breathing the 'soup' of higher pressure environments and may require breathing aids. * Terran Gravity - .8 to 1.5 atmospheres - Terran normal * High Presssure - 1.5 to 4 atmospheres - High pressure exists on larger planets and underwater on any planet. * Very High Pressure - 4 to 100 atmospheres - * Intense Pressure - 100 to 1000 atmospheres - Equal to the bottom of the terran ocean. * Extreme Pressure - 1000+ atmospheres -") "Space Heat Disspation" (rule :name "Space Heat Disspation" :summary "* There are three modes of heat transfer: conduction, convection, and radiation. The first two require a medium that space does not provide, so most heat is dissipated via radiation, but when necessary, heat can also be dissipated by vaporizing a small amount of reaction mass.") "Space Movement" (rule :name "Space Movement" :summary "* Use [Vector Movement] rules with the following modifications. * All objects are always moving. Only the relative difference in speed is important, not the speed itself. * In space, [Speed] represents acceleration/deceleration and is measured in g's (1g=10m/s/s). * Given sufficient fuel, there is no practical maximum to the speed attainable. It would take 3.5 days at 1g to reach 1% of the speed of light.") "Space Combat" (rule :name "Space Combat" :reference "* He's intelligent, but not experienced. His pattern indicates two-dimensional thinking. - Spock, Star Trek II" :summary "* Any dropped items, including clouds and mines continue moving at the same speed and direction of the dropping unit.") "Space Travel" (rule :name "Space Travel" :reference "* At least 100 times the total energy output of the entire world would be required for the voyage to Alpha Centauri in under 100 years." :summary "* Space Travel is a two-piece problem; accelerate for half time (and half distance), then decelerate the other half time (and distance). * Travel Time: If you know the desired acceleration of your spacecraft (generally one g or 9.81 m/s2) and wish to calculate the transit time, the Brachistochrone equation is: ** T = 2 * sqrt[ D/A ] ** where T = transit time (seconds), D = distance (meters), A = acceleration (m/s2) * Travel Time with Coasting: Spacecraft that cannot accelerate the entire distance must coast during the middle of the trip and use the following calculation: ** T = ((D - (A * t^2)) / (A * t)) + (2*t) ** where T = transit time (seconds), D = distance (meters), A = acceleration (m/s2), t = duration of acceleration phase (seconds), just the acceleration phase only, NOT the acceleration+deceleration phase. * Note that the coast duration time is of course = T - (2*t) * Acceleration: If you know the desired transit time and wish to calculate the required acceleration, the equation is: A = (4 * D) / T2"))))) :Space (chapter :name "Space" :sectionmap (sectionmap "Space Terrain" (section :name "Space Terrain" :rulemap (rulemap "Magnetic Storm" (rule :name "Magnetic Storm" :image "Units/SpaceAndTime/MagneticStorm.jpg" :summary "* [+1 Hazard] * Blocks [Line of Sight] * A Magnetic Storm is treated as a [Nebula] with the following additional effects. * [-1 Communications] per space from the edge of the field. * [-1 Shielding] per space from the edge of the field.") "Micro-meteor Field" (rule :name "Micro-meteor Field") :Nebula (rule :name "Nebula" :image "Units/SpaceAndTime/Nebula.jpg" :summary "* Nebulas are placed randomly on the map. * At the beginning of the game roll 1 die to determine Speed and 1 die to randomize direction. * At the end of each turn all nebulas move their Speed in the given direction. * [+1 Hazard] * Blocks [Line of Sight]") "Solar Flare" (rule :name "Solar Flare" :image "Units/SpaceAndTime/SolarFlare.jpg" :reference "This photograph shows one of the most spectacular solar flares ever recorded; the base of the flare is more than 591Mm across.")) :unitmap (unitmap "Arctic World" (unit :name "Arctic World") "Arid World" (unit :name "Arid World") "Asteroid Field" (unit :name "Asteroid Field" :image "Units/SpaceAndTime/Asteroid.png" :summary "* Asteroid fields are placed randomly on the map. * At the beginning of the game roll 1 die to determine Speed and 1 die to randomize direction. * At the end of each turn all asteroids move their Speed in the given direction. * If they collide with a unit, use the asteroid's and the unit's Speed and Body to determine damage. * [+2 Hazard]" :height "500km" :length "500m" :width "500m") "Black Hole" (unit :name "Black Hole" :image "Units/SpaceAndTime/BlackHole.png" :summary "* Accretion Disk * Event Horizon" :titles "Singularity") "Blue Giant Star" (unit :name "Blue Giant Star") :Comet (unit :name "Comet" :image "Units/SpaceAndTime/Comet.png") "Debris Field" (unit :name "Debris Field" :image "Units/SpaceAndTime/SpaceDebris.jpg" :summary "* [+2 Hazard] * Debris Fields are treated as an [Asteroid Field]. * Any large unit that explodes is replaced with a Debris Field.") "Desert World" (unit :name "Desert World") "Dyson Sphere" (unit :name "Dyson Sphere") "Gas Giant" (unit :name "Gas Giant") "Greenhouse World" (unit :name "Greenhouse World") "Ionized Atmosphere World" (unit :name "Ionized Atmosphere World" :summary "* Atmosphere is heavily ionized which produces powerful lightning storms and regularly disrupts electrical systems and communications.") "Irradiated World" (unit :name "Irradiated World") "Jungle World" (unit :name "Jungle World") :Meteorite (unit :name "Meteorite" :reference "Armaggeddon") "Methane Ocean World" (unit :name "Methane Ocean World") "Neutron Star" (unit :name "Neutron Star" :image "Units/SpaceAndTime/NeutronStar.png" :reference "* 12 miles across and 1.4 times the mass of the sun. One teaspoonful would weigh a billion tons." :mass "2x10^27tons" :length "20km") "Ocean World" (unit :name "Ocean World") "Proto World" (unit :name "Proto World") :Pulsar (unit :name "Pulsar" :image "Units/SpaceAndTime/Pulsar.png") "Red Giant Star" (unit :name "Red Giant Star") "Ring World" (unit :name "Ring World") "Ringed Gas Giant" (unit :name "Ringed Gas Giant") "Solar Storm World" (unit :name "Solar Storm World" :summary "* This planet is routinely bombarded by intense solar radiation. The planet itself is not radioactive, but when solar storms appear all life is scoured from any exposed surface. Life underground or underwater is possible.") "Seasonally Extreme World" (unit :name "Seasonally Extreme World" :summary "* A planet with a very oblong orbit and high axial shift will produce severe changes in seasons shifting from artic to tropic environments during the year. Such a punishing environment is difficult for complex life to develop. Simple life forms will tend toward short life spans or hibernation during winter months with a massive spring bloom and fall die off.") "Seasonless World" (unit :name "Seasonless World" :summary "* A planet with a nearly circular orbit and minor axial shift will produce bands of terrain where the seasons don't change throughout the year. Polar areas are uniformly cold and equatorial areas are uniformly hot. Such a predictable environment is ideal for life to develop.") "Seismic World" (unit :name "Seismic World") "Stony World" (unit :name "Stony World") "Storm World" (unit :name "Storm World") "Swamp World" (unit :name "Swamp World" :summary "* The combination of mild greenhouse effect and high amounts of surface water creates a world where most land masses are densely covered with vegetation. Very little dry land exists and the vegetation mostly has its roots underwater. Some particularly dense vegetation can be walked on. Quicksand, parasites, insects, water predators, and other threats are common.") "Toxic World" (unit :name "Toxic World") "Tropical World" (unit :name "Tropical World") "Tundra World" (unit :name "Tundra World") "Yellow Star" (unit :name "Yellow Star"))))) "Dimensional Travel" (chapter :name "Dimensional Travel" :sectionmap (sectionmap "Dimensional Rules" (section :name "Dimensional Rules" :rulemap (rulemap "Parallel Dimensions" (rule :name "Parallel Dimensions") "Dimensional Ripples" (rule :name "Dimensional Ripples" :summary "* Changes made to one dimension can cause similar changes to nearby parallel dimensions like ripples in a pond. Temporal Distortion Waves always cause Dimensional Ripples.") "Dimensional Storm" (rule :name "Dimensional Storm" :summary "* A Dimensional Storm is a theoretical disaster where the barriers between dimensions are broken and events from unrelated time periods and dimensions become mixed up creating chaos across multiple dimensions."))))) "Time Travel" (chapter :name "Time Travel" :reference "* Philosophy - Though we are now able to travel through time, there remains much speculation over how time travel actually works. The general concensus is that the term 'Time Stream' may be an accurate description. Time acts like a river of water, and we are travelers on that river. But our boats are unpowered, so we drift with the current until we hit the shore. Now, with the power of the Time Rotor, we may move against the current of time to any time or place we choose." :summary "* The Vortex - The Vortex is a temporal zero-point where time does not exist. The Vortex appears as a tunnel headed away from the viewer regardless of which direction the viewer looks. Entering the Vortex is feels like dying (and probably is a death). Exiting the Vortex is like being born (or reborn). * Beings and objects may travel through the the [Vortex] emerging at another point in Time. Every point in time is equi-distant from the [Vortex]." :sectionmap (sectionmap "Time Travel Rules" (section :name "Time Travel Rules" :rulemap (rulemap "Laws of Time" (rule :name "Laws of Time" :summary "Time Travellers * Emphemeral - Those who have never traveled in time are called Ephemerals. All the events of their lives may be altered repeatedly by one or more time travelers, and they will not sense anything is amiss or remember anything about the previous time stream. * Temporal - Once a being travels through time, it is permanently separated from the normal time stream and is called a Temporal. The events of a Temporal's life may also be changed by other time travelers, but a Temporal will remember some or all of the previous time stream.") "History Can Be Changed" (rule :name "History Can Be Changed") "Law of Death" (rule :name "Law of Death" :reference "Final Destination" :summary "* A Temporal has one limitation that Emphemerals do not: the moment of death of a Temporal cannot be undone. Since only living beings may travel through time, when a Temporal dies, he or she can no longer move forward in time. Even if time is rewritten to prevent the Temporal's death, the time traveler will still die at the exact age of his original death regardless of the circumstances. The cause of death may vary, but death will always occur at the exact age that the original death happened.") "Law of Preservation" (rule :name "Law of Preservation" :summary "* Jumping through time necessarily causes a number of paradoxes, but Time seems to have a self-healing mechanism that limits the scope of changes to the Timeline, provided the changes are small enough. One of these effects is when a person makes a time jump, that jump cannot cause a series of events that ultimately prevents itself. For example: say a person jumped back in time because of a temporal disturbance. He then prevented the disturbance from ever happening. Logically, this is a paradox. If the disturbance never happened, then he would never go back to prevent the disturbance, so the disturbance would happen, so he would go back to prevent the disturbance, etc. Instead the last jump that prevents the disturbance occurs, the disturbance never occurs, and all memory of what happened during the paradox is lost. This time period has become complex but is stable. Of course, a further time jump might erase the actions of the previous jump, since the last jump will always stand despite any paradoxes created.") "Loop Trap Paradox" (rule :name "Loop Trap Paradox" :summary "* Whenever two versions of same person exist at the same point in time, a Loop Trap Paradox is created. The future version of the person immediately vanishes and the past version of the person performs the same actions that the future version did eventually returning to the same moment where both versions exist at the same time and the cycle continues eternally. The person is doomed to repeat the same actions over and over again unless another time traveler intervenes. * To avoid Loop Traps, it is vitally important that a time traveler keeps accurate track of every period of time to which he or she has traveled.") "Matter Suppression" (rule :name "Matter Suppression" :summary "* Matter cannot normally travel through time, but time technology allows certain narrow exceptions. Living matter can travel freely through time, seemingly based only on the will to live. Non-living matter, however, decomposes rapidly when moved through time. Non-living objects that travel backwards in time decompose faster the farther back in time they travel. Non-living objects that travel forward in time beyond their original time period decompose immediately. For this reason, no one has been able to travel to a future beyond their time machines 'present' because their time machines vanish stranding them in the Vortex.") "Messages in Time" (rule :name "Messages in Time" :summary "* With the benefit of hindsight, there are many times when it would be convenient to send a message to a past version of yourself to change a course of action. Of course, this would be a paradox: if you don't take the same action in the past, you would never send the message to change the action. If you did attempt to leave a message to a past self, the rule of Matter Suppression would cause the message to disappear to prevent the paradox. However, by placing a message in the Time Rotor, the message can resist Matter Suppression for up to 1 day. If the message is successfully delivered, the future self will typically vanish immediately since that future will have been erased in favor of a new future created by the message. * Self Preventing Mission - Using a Message in Time, it is possible to prevent every reason why the initial Time Travel was made. In this case, the mission never occurs, though memories of the trip may remain.") "Temporal Disaster Wave" (rule :name "Temporal Disaster Wave" :summary "* Sometimes massive changes to history will cause such an enormous [Temporal Distortion Wave] that it travels all the way through history to the present. These are called Temporal Disaster Waves. A Disaster Wave will have wide-sweeping ramifications and are far too dangerous and random to allow.") "Temporal Distortion" (rule :name "Temporal Distortion") "Temporal Distortion Wave" (rule :name "Temporal Distortion Wave" :reference "History Tends to Repeat Itself" :summary "* Major temporal alterations can be made without significantly altering history. Major changes will, however, create a Temporal Distortion Wave. This wave in time will slowly flow around the changed events, making minor alterations in names and events as it goes. Eventually, the wave subsides when history goes back on course with only minor changes to the history books. For Example: killing Hitler as a baby will have little effect on history, because the time stream will find someone else to fill his role, and the history books will just have different names. * Severity - A Distortion Wave is rated based on the number of years it will travel before the time stream returns to its normal course. History during this period is altered, but time futureward of the wave is relatively normal. * Detection - A person that experiences a wave washing through his/her time stream will experience radical changes to events. Of course, only time travelers will notice these changes as unusual. Those that can analyze the time stream can see the wave traveling through time. If a person is futureward of the wave, he/she will not detect any changes until the wave approaches. * Stopping the Wave - A Wave can still be stopped by jumping forward in time past the wave and choosing major events that took place in the normal time stream and forcing them to happen again despite the changes the oncoming Wave would create. This action will act as a dam, preventing the Wave from doing further damage to the future. The time stream is now safe, but the work is not complete because a Standing Wave has been created. * Standing Wave- A Distortion Wave that has been stopped futureward will be reflected back to the past changing history back again until it reaches its origin and reflected futureward again repeatining the process, changing time back and forth infinitely in what is called a Standing Wave. A Standing Wave remains very dangerous and can only be ended by preventing the original source of the wave which will return the time stream to normal.") "Temporal Memory" (rule :name "Temporal Memory" :summary "* When a Temporal has his time stream rewritten by another Time Traveler, it is possible to retain dream-like memories of the time line that no longer exists.") "Traveling Futureward" (rule :name "Traveling Futureward" :summary "* Traveling to Ones Own Future - Time machines cannot travel farther forward in time beyond their 'present'. Any attempt to do so results in the immediate disintegration of the time machine and passengers are stranded in the Vortex. * Futureward Time Hops - The simplest way of performing multiple time hops is to travel back to a time period and then make a number of futureward hops from there. In this way one can see the development of a subject over time such as the construction of a building. It also allow one to view the consequences of any changes made to history. * Futureward Time Hops Complications - Making forward hops essentially avoids paradoxes, but other problems can occur. People may recognize you which can be a problem if your appearance hasn't changed. They may ask questions about the intervening time and why they never kept in touch. If you keep arriving in the same spot at different times, you may set yourself up for an ambush. Be cautious and change your physical destination as well as your temporal on each jump.") "Traveling Pastward" (rule :name "Traveling Pastward" :summary "* Traveling to Ones Own Past - Any attempt to enter a time period where you have already been creates a [Loop Trap Paradox]. Your future version immediately vanishes and the past version infinitely repeats the steps leading to the Loop Trap. * Pastward Time Hops - Multiple jumps back in time are often desirable because as one learns more about the current situation it is usually easier to go further back in time to alter the situation before it has fully developed. When done perfectly, the original problem can be prevented entirely. * Pastward Time Hops Complications - Altering the past is the way to create paradoxes. Multiple pastward hops increases the risk with each hop. As you progressively change the past, you may also cause changes to your own past. You can find yourself appearing in a time period with no memory of why."))))))))
nx/tactics/books/space_and_time / tacticsbook
Description:
Function Name:
  • tacticsbook
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func tacticsbook : base/book (book :name "Space and Time" :image "Space.jpg" :chaptermap (chaptermap "Space and Time Overview" (chapter :name "Space and Time Overview" :sectionmap (sectionmap "Why Tactics: Space and Time?" (section :name "Why Tactics: Space and Time?" :summary "* Space is deadly to any normal lifeforms. * Militarily space represents the ultimate high ground. Anyone in orbit can see everything below and can reach any place on a planet in minutes."))) "Space Travel" (chapter :name "Space Travel" :sectionmap (sectionmap "Space Travel Rules" (section :name "Space Travel Rules" :rulemap (rulemap "Planetary Gravity" (rule :name "Planetary Gravity" :summary "* Microgravity - 0G to .2G - Microgravity only exists in space and on moons. Low gravity favors the development of tall, slight frames who will have much difficulty in 1G environments. Worlds with such low gravities do not maintain an atmosphere. * Very Low Gravity - .2G to .5G - Very Low gravity exists on small planets and large moons. Low gravity favors the development of tall, slight frames who will have difficulty in 1G environments. Worlds with such low gravities do not maintain an atmosphere. * Low Gravity - .5G to .8G - Low exists on smaller planets. Low gravity favors the development of tall frames. Worlds with low gravities will have thin atmospheres and consequently be exposed to higher levels of radiation. * Terran Gravity - .8G to 1.2G * High Gravity - 1.2G to 1.5G - High gravity exists on larger planets. High gravity favors short, heavy frames. * Very High Gravity - 1.5G to 2.5G - Very high gravity exists on larger planets. Very high gravity favors short, heavy frames. * Intense Gravity - 1.8G to 2.5G - Intense gravity exists on gas giant planets like Jupiter. Few creatures can survive such extreme gravity where the atmosphere is extremely dense. * Extreme Gravity - 2.5G+ - Extreme gravity exists on stars like the Sun (28G) with the extreme end being a Neutron star (300,000,000,000G) or a black hole.") "Planetary Atmosphere" (rule :name "Planetary Atmosphere" :summary "* Micropressure - 0 to .5 atmospheres - Micropressure only exists in space and even on Terran-sized planets (such as Mars). Most creatures cannot survive such low pressure. * Low Pressure - .5 to .8 atmospheres - Low pressure can exist on Terran-sized planets and very large moons. Low pressure favors the development of expanded lung capacity and relative resistance to hypoxia. Conversely such creatures struggle when breathing the 'soup' of higher pressure environments and may require breathing aids. * Terran Gravity - .8 to 1.5 atmospheres - Terran normal * High Presssure - 1.5 to 4 atmospheres - High pressure exists on larger planets and underwater on any planet. * Very High Pressure - 4 to 100 atmospheres - * Intense Pressure - 100 to 1000 atmospheres - Equal to the bottom of the terran ocean. * Extreme Pressure - 1000+ atmospheres -") "Space Heat Disspation" (rule :name "Space Heat Disspation" :summary "* There are three modes of heat transfer: conduction, convection, and radiation. The first two require a medium that space does not provide, so most heat is dissipated via radiation, but when necessary, heat can also be dissipated by vaporizing a small amount of reaction mass.") "Space Movement" (rule :name "Space Movement" :summary "* Use [Vector Movement] rules with the following modifications. * All objects are always moving. Only the relative difference in speed is important, not the speed itself. * In space, [Speed] represents acceleration/deceleration and is measured in g's (1g=10m/s/s). * Given sufficient fuel, there is no practical maximum to the speed attainable. It would take 3.5 days at 1g to reach 1% of the speed of light.") "Space Combat" (rule :name "Space Combat" :reference "* He's intelligent, but not experienced. His pattern indicates two-dimensional thinking. - Spock, Star Trek II" :summary "* Any dropped items, including clouds and mines continue moving at the same speed and direction of the dropping unit.") "Space Travel" (rule :name "Space Travel" :reference "* At least 100 times the total energy output of the entire world would be required for the voyage to Alpha Centauri in under 100 years." :summary "* Space Travel is a two-piece problem; accelerate for half time (and half distance), then decelerate the other half time (and distance). * Travel Time: If you know the desired acceleration of your spacecraft (generally one g or 9.81 m/s2) and wish to calculate the transit time, the Brachistochrone equation is: ** T = 2 * sqrt[ D/A ] ** where T = transit time (seconds), D = distance (meters), A = acceleration (m/s2) * Travel Time with Coasting: Spacecraft that cannot accelerate the entire distance must coast during the middle of the trip and use the following calculation: ** T = ((D - (A * t^2)) / (A * t)) + (2*t) ** where T = transit time (seconds), D = distance (meters), A = acceleration (m/s2), t = duration of acceleration phase (seconds), just the acceleration phase only, NOT the acceleration+deceleration phase. * Note that the coast duration time is of course = T - (2*t) * Acceleration: If you know the desired transit time and wish to calculate the required acceleration, the equation is: A = (4 * D) / T2"))))) :Space (chapter :name "Space" :sectionmap (sectionmap "Space Terrain" (section :name "Space Terrain" :rulemap (rulemap "Magnetic Storm" (rule :name "Magnetic Storm" :image "Units/SpaceAndTime/MagneticStorm.jpg" :summary "* [+1 Hazard] * Blocks [Line of Sight] * A Magnetic Storm is treated as a [Nebula] with the following additional effects. * [-1 Communications] per space from the edge of the field. * [-1 Shielding] per space from the edge of the field.") "Micro-meteor Field" (rule :name "Micro-meteor Field") :Nebula (rule :name "Nebula" :image "Units/SpaceAndTime/Nebula.jpg" :summary "* Nebulas are placed randomly on the map. * At the beginning of the game roll 1 die to determine Speed and 1 die to randomize direction. * At the end of each turn all nebulas move their Speed in the given direction. * [+1 Hazard] * Blocks [Line of Sight]") "Solar Flare" (rule :name "Solar Flare" :image "Units/SpaceAndTime/SolarFlare.jpg" :reference "This photograph shows one of the most spectacular solar flares ever recorded; the base of the flare is more than 591Mm across.")) :unitmap (unitmap "Arctic World" (unit :name "Arctic World") "Arid World" (unit :name "Arid World") "Asteroid Field" (unit :name "Asteroid Field" :image "Units/SpaceAndTime/Asteroid.png" :summary "* Asteroid fields are placed randomly on the map. * At the beginning of the game roll 1 die to determine Speed and 1 die to randomize direction. * At the end of each turn all asteroids move their Speed in the given direction. * If they collide with a unit, use the asteroid's and the unit's Speed and Body to determine damage. * [+2 Hazard]" :height "500km" :length "500m" :width "500m") "Black Hole" (unit :name "Black Hole" :image "Units/SpaceAndTime/BlackHole.png" :summary "* Accretion Disk * Event Horizon" :titles "Singularity") "Blue Giant Star" (unit :name "Blue Giant Star") :Comet (unit :name "Comet" :image "Units/SpaceAndTime/Comet.png") "Debris Field" (unit :name "Debris Field" :image "Units/SpaceAndTime/SpaceDebris.jpg" :summary "* [+2 Hazard] * Debris Fields are treated as an [Asteroid Field]. * Any large unit that explodes is replaced with a Debris Field.") "Desert World" (unit :name "Desert World") "Dyson Sphere" (unit :name "Dyson Sphere") "Gas Giant" (unit :name "Gas Giant") "Greenhouse World" (unit :name "Greenhouse World") "Ionized Atmosphere World" (unit :name "Ionized Atmosphere World" :summary "* Atmosphere is heavily ionized which produces powerful lightning storms and regularly disrupts electrical systems and communications.") "Irradiated World" (unit :name "Irradiated World") "Jungle World" (unit :name "Jungle World") :Meteorite (unit :name "Meteorite" :reference "Armaggeddon") "Methane Ocean World" (unit :name "Methane Ocean World") "Neutron Star" (unit :name "Neutron Star" :image "Units/SpaceAndTime/NeutronStar.png" :reference "* 12 miles across and 1.4 times the mass of the sun. One teaspoonful would weigh a billion tons." :mass "2x10^27tons" :length "20km") "Ocean World" (unit :name "Ocean World") "Proto World" (unit :name "Proto World") :Pulsar (unit :name "Pulsar" :image "Units/SpaceAndTime/Pulsar.png") "Red Giant Star" (unit :name "Red Giant Star") "Ring World" (unit :name "Ring World") "Ringed Gas Giant" (unit :name "Ringed Gas Giant") "Solar Storm World" (unit :name "Solar Storm World" :summary "* This planet is routinely bombarded by intense solar radiation. The planet itself is not radioactive, but when solar storms appear all life is scoured from any exposed surface. Life underground or underwater is possible.") "Seasonally Extreme World" (unit :name "Seasonally Extreme World" :summary "* A planet with a very oblong orbit and high axial shift will produce severe changes in seasons shifting from artic to tropic environments during the year. Such a punishing environment is difficult for complex life to develop. Simple life forms will tend toward short life spans or hibernation during winter months with a massive spring bloom and fall die off.") "Seasonless World" (unit :name "Seasonless World" :summary "* A planet with a nearly circular orbit and minor axial shift will produce bands of terrain where the seasons don't change throughout the year. Polar areas are uniformly cold and equatorial areas are uniformly hot. Such a predictable environment is ideal for life to develop.") "Seismic World" (unit :name "Seismic World") "Stony World" (unit :name "Stony World") "Storm World" (unit :name "Storm World") "Swamp World" (unit :name "Swamp World" :summary "* The combination of mild greenhouse effect and high amounts of surface water creates a world where most land masses are densely covered with vegetation. Very little dry land exists and the vegetation mostly has its roots underwater. Some particularly dense vegetation can be walked on. Quicksand, parasites, insects, water predators, and other threats are common.") "Toxic World" (unit :name "Toxic World") "Tropical World" (unit :name "Tropical World") "Tundra World" (unit :name "Tundra World") "Yellow Star" (unit :name "Yellow Star"))))) "Dimensional Travel" (chapter :name "Dimensional Travel" :sectionmap (sectionmap "Dimensional Rules" (section :name "Dimensional Rules" :rulemap (rulemap "Parallel Dimensions" (rule :name "Parallel Dimensions") "Dimensional Ripples" (rule :name "Dimensional Ripples" :summary "* Changes made to one dimension can cause similar changes to nearby parallel dimensions like ripples in a pond. Temporal Distortion Waves always cause Dimensional Ripples.") "Dimensional Storm" (rule :name "Dimensional Storm" :summary "* A Dimensional Storm is a theoretical disaster where the barriers between dimensions are broken and events from unrelated time periods and dimensions become mixed up creating chaos across multiple dimensions."))))) "Time Travel" (chapter :name "Time Travel" :reference "* Philosophy - Though we are now able to travel through time, there remains much speculation over how time travel actually works. The general concensus is that the term 'Time Stream' may be an accurate description. Time acts like a river of water, and we are travelers on that river. But our boats are unpowered, so we drift with the current until we hit the shore. Now, with the power of the Time Rotor, we may move against the current of time to any time or place we choose." :summary "* The Vortex - The Vortex is a temporal zero-point where time does not exist. The Vortex appears as a tunnel headed away from the viewer regardless of which direction the viewer looks. Entering the Vortex is feels like dying (and probably is a death). Exiting the Vortex is like being born (or reborn). * Beings and objects may travel through the the [Vortex] emerging at another point in Time. Every point in time is equi-distant from the [Vortex]." :sectionmap (sectionmap "Time Travel Rules" (section :name "Time Travel Rules" :rulemap (rulemap "Laws of Time" (rule :name "Laws of Time" :summary "Time Travellers * Emphemeral - Those who have never traveled in time are called Ephemerals. All the events of their lives may be altered repeatedly by one or more time travelers, and they will not sense anything is amiss or remember anything about the previous time stream. * Temporal - Once a being travels through time, it is permanently separated from the normal time stream and is called a Temporal. The events of a Temporal's life may also be changed by other time travelers, but a Temporal will remember some or all of the previous time stream.") "History Can Be Changed" (rule :name "History Can Be Changed") "Law of Death" (rule :name "Law of Death" :reference "Final Destination" :summary "* A Temporal has one limitation that Emphemerals do not: the moment of death of a Temporal cannot be undone. Since only living beings may travel through time, when a Temporal dies, he or she can no longer move forward in time. Even if time is rewritten to prevent the Temporal's death, the time traveler will still die at the exact age of his original death regardless of the circumstances. The cause of death may vary, but death will always occur at the exact age that the original death happened.") "Law of Preservation" (rule :name "Law of Preservation" :summary "* Jumping through time necessarily causes a number of paradoxes, but Time seems to have a self-healing mechanism that limits the scope of changes to the Timeline, provided the changes are small enough. One of these effects is when a person makes a time jump, that jump cannot cause a series of events that ultimately prevents itself. For example: say a person jumped back in time because of a temporal disturbance. He then prevented the disturbance from ever happening. Logically, this is a paradox. If the disturbance never happened, then he would never go back to prevent the disturbance, so the disturbance would happen, so he would go back to prevent the disturbance, etc. Instead the last jump that prevents the disturbance occurs, the disturbance never occurs, and all memory of what happened during the paradox is lost. This time period has become complex but is stable. Of course, a further time jump might erase the actions of the previous jump, since the last jump will always stand despite any paradoxes created.") "Loop Trap Paradox" (rule :name "Loop Trap Paradox" :summary "* Whenever two versions of same person exist at the same point in time, a Loop Trap Paradox is created. The future version of the person immediately vanishes and the past version of the person performs the same actions that the future version did eventually returning to the same moment where both versions exist at the same time and the cycle continues eternally. The person is doomed to repeat the same actions over and over again unless another time traveler intervenes. * To avoid Loop Traps, it is vitally important that a time traveler keeps accurate track of every period of time to which he or she has traveled.") "Matter Suppression" (rule :name "Matter Suppression" :summary "* Matter cannot normally travel through time, but time technology allows certain narrow exceptions. Living matter can travel freely through time, seemingly based only on the will to live. Non-living matter, however, decomposes rapidly when moved through time. Non-living objects that travel backwards in time decompose faster the farther back in time they travel. Non-living objects that travel forward in time beyond their original time period decompose immediately. For this reason, no one has been able to travel to a future beyond their time machines 'present' because their time machines vanish stranding them in the Vortex.") "Messages in Time" (rule :name "Messages in Time" :summary "* With the benefit of hindsight, there are many times when it would be convenient to send a message to a past version of yourself to change a course of action. Of course, this would be a paradox: if you don't take the same action in the past, you would never send the message to change the action. If you did attempt to leave a message to a past self, the rule of Matter Suppression would cause the message to disappear to prevent the paradox. However, by placing a message in the Time Rotor, the message can resist Matter Suppression for up to 1 day. If the message is successfully delivered, the future self will typically vanish immediately since that future will have been erased in favor of a new future created by the message. * Self Preventing Mission - Using a Message in Time, it is possible to prevent every reason why the initial Time Travel was made. In this case, the mission never occurs, though memories of the trip may remain.") "Temporal Disaster Wave" (rule :name "Temporal Disaster Wave" :summary "* Sometimes massive changes to history will cause such an enormous [Temporal Distortion Wave] that it travels all the way through history to the present. These are called Temporal Disaster Waves. A Disaster Wave will have wide-sweeping ramifications and are far too dangerous and random to allow.") "Temporal Distortion" (rule :name "Temporal Distortion") "Temporal Distortion Wave" (rule :name "Temporal Distortion Wave" :reference "History Tends to Repeat Itself" :summary "* Major temporal alterations can be made without significantly altering history. Major changes will, however, create a Temporal Distortion Wave. This wave in time will slowly flow around the changed events, making minor alterations in names and events as it goes. Eventually, the wave subsides when history goes back on course with only minor changes to the history books. For Example: killing Hitler as a baby will have little effect on history, because the time stream will find someone else to fill his role, and the history books will just have different names. * Severity - A Distortion Wave is rated based on the number of years it will travel before the time stream returns to its normal course. History during this period is altered, but time futureward of the wave is relatively normal. * Detection - A person that experiences a wave washing through his/her time stream will experience radical changes to events. Of course, only time travelers will notice these changes as unusual. Those that can analyze the time stream can see the wave traveling through time. If a person is futureward of the wave, he/she will not detect any changes until the wave approaches. * Stopping the Wave - A Wave can still be stopped by jumping forward in time past the wave and choosing major events that took place in the normal time stream and forcing them to happen again despite the changes the oncoming Wave would create. This action will act as a dam, preventing the Wave from doing further damage to the future. The time stream is now safe, but the work is not complete because a Standing Wave has been created. * Standing Wave- A Distortion Wave that has been stopped futureward will be reflected back to the past changing history back again until it reaches its origin and reflected futureward again repeatining the process, changing time back and forth infinitely in what is called a Standing Wave. A Standing Wave remains very dangerous and can only be ended by preventing the original source of the wave which will return the time stream to normal.") "Temporal Memory" (rule :name "Temporal Memory" :summary "* When a Temporal has his time stream rewritten by another Time Traveler, it is possible to retain dream-like memories of the time line that no longer exists.") "Traveling Futureward" (rule :name "Traveling Futureward" :summary "* Traveling to Ones Own Future - Time machines cannot travel farther forward in time beyond their 'present'. Any attempt to do so results in the immediate disintegration of the time machine and passengers are stranded in the Vortex. * Futureward Time Hops - The simplest way of performing multiple time hops is to travel back to a time period and then make a number of futureward hops from there. In this way one can see the development of a subject over time such as the construction of a building. It also allow one to view the consequences of any changes made to history. * Futureward Time Hops Complications - Making forward hops essentially avoids paradoxes, but other problems can occur. People may recognize you which can be a problem if your appearance hasn't changed. They may ask questions about the intervening time and why they never kept in touch. If you keep arriving in the same spot at different times, you may set yourself up for an ambush. Be cautious and change your physical destination as well as your temporal on each jump.") "Traveling Pastward" (rule :name "Traveling Pastward" :summary "* Traveling to Ones Own Past - Any attempt to enter a time period where you have already been creates a [Loop Trap Paradox]. Your future version immediately vanishes and the past version infinitely repeats the steps leading to the Loop Trap. * Pastward Time Hops - Multiple jumps back in time are often desirable because as one learns more about the current situation it is usually easier to go further back in time to alter the situation before it has fully developed. When done perfectly, the original problem can be prevented entirely. * Pastward Time Hops Complications - Altering the past is the way to create paradoxes. Multiple pastward hops increases the risk with each hop. As you progressively change the past, you may also cause changes to your own past. You can find yourself appearing in a time period with no memory of why."))))))))
nx/tactics/books/superheroes
Description:
Package Name:
  • nx/tactics/books/superheroes
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
Constants:
Functions:
  • tacticsbook
Source Code:
  • (package nx/tactics/books/superheroes :libs (lib base :path nx/tactics/base)) (func tacticsbook : base/book (book :name "Superheroes" :image "Superpowers.jpg" :chaptermap (chaptermap "Superheroes Overview" (chapter :name "Superheroes Overview" :sectionmap (sectionmap "Why Tactics: Superheroes?" (section :name "Why Tactics: Superheroes?"))) "Superhero Characters" (chapter :name "Superhero Characters" :sectionmap (sectionmap "Superhero Rules" (section :name "Superhero Rules" :rulemap (rulemap "Super Powers" (rule :name "Super Powers" :summary "* Superhero characters do not have a maximum Body, but their Combat Skills are limited to level 10 since they rely on their powers more than skill. * Superpowers include abilities from all other genres. Particularly relevent sections are: Magic, Martial Arts, Mentalism, Modern, and Ancients.") :Heroes (rule :name "Heroes" :summary "* Heroes live a life removed from normal men, yet they risk their lives to help others and battle evil. Their motives vary, but they are united in these common goals. * Many heroes hold themselves to a high standard, feeling that they must be better than the villians they pursue. Their reward is a greater acceptance and aid from the public, police, and other heroes. * Other heroes may use dubious tactics and may therefore be mistaken for villains. * Super Hero Teams - The most powerful of these may establish public bases.") :Villians (rule :name "Villians" :summary "* Villians, like heroes, are driven, but their desires are far different from herores. * Power lust, revenge, rage, greed, and insanity are the typical motivations for villians. * Super Villian Groups - Fortunately, the most powerful villians usually cannot get along, but many of the weaker villians see strength in numbers.") :Organizations (rule :name "Organizations" :summary "* Military - The study of superbeings has greatly advanced military science, so expect military units to possess exceptional equipment. * Special Agents - As with military advances, special agencies around the world have learned to adapt the a world of superbeings. Unlike the military, clandestine groups are not particularly effected by superbeings since their work is generally more subtle. Security, however, is difficult to maintain with powerful beings with telepathic and stealh powers roaming the world. * Crime - Criminal groups can gain huge advantages from villians, but that blade cuts both ways so any group dealing with such powerful allies always maintain contingency plans.") :Cliches (rule :name "Cliches" :reference "* Here's the plan. We get the warhead and we hold the world ransom for... ONE MILLION DOLLARS! - Dr. Evil, Austin Powers * Wait, aren't you even going to watch them? They could get away! No no no, I'm going to leave them alone and not actually witness them dying, I'm just gonna assume it all went to plan. What? - Dr. Evil, Austin Powers * He starts monologuing! He starts like, this prepared speech about how 'feeble' I am compared to him, how 'inevitable' my defeat is, how 'the world...will soon...be his'...I mean, the guy has me on a platter and he won't shut up! - Lucius, The Incredibles" :summary "* Superhero stories are loaded with cliches. The whole heroic adventure is a bit of cliche itself. * Conquer the World - Become so powerful that none can stand against you. * Blackmail - Destroy cities unless their demands are met. * Heist - Money is almost as strong a motivator for villians as power. * Having Fun - Villians enjoy their power and are not afraid to use it. Vandalism and displays of power give some villians a particular thrill. * Matching Wits - Some of the most egotistical villians feel that their victories would be too easy without pitting their own abilities against the heroes, and will actually tip their hands to force a confrontation. * Death Trap - Villians hate to see a hero die too quickly. Better to let them fully comprehend their defeat before they die. * Threatening Innocents - This is a favorite of villians as it underscores the difference between the heroes heroes and the villians. Some villians, however, find hiding behind bystanders to be cowardly. * Playing Possum - Often a villian may seem defeated, but often have a last trick up their sleeve. * Killing Allies - Villians love to punish their own. It shows how evil they are and is a great way to motivate others by showing the price of failure or rebellion. * Monologing - * Escape Routes - Villians somehow manage to escape certain death on a regular basis. They are always well prepared, and they also seem almost as lucky as the heroes."))))) "DC Universe" (chapter :name "DC Universe" :sectionmap (sectionmap :Villains (section :name "Villains" :unitmap (unitmap :Brainiac (unit :name "Brainiac" :image "Superheroes/Brainiac.png" :unitskillmap (unitskillmap :Mastermind (unitskill :name "Mastermind"))) :Catwoman (unit :name "Catwoman" :image "Superheroes/Catwoman.png") :Darkseid (unit :name "Darkseid" :image "Superheroes/Darkseid.png" :unitskillmap (unitskillmap :Mastermind (unitskill :name "Mastermind"))) :Joker (unit :name "Joker" :image "Superheroes/Joker.png" :summary "* You won't kill me out of some misplaced sense of self-righteousness, and I won't kill you because you're just too much fun. I think you and I are destined to do this forever." :unitskillmap (unitskillmap :Mastermind (unitskill :name "Mastermind"))) :Sinestro (unit :name "Sinestro" :image "Superheroes/Sinestro.png"))))) "Dragonball Z" (chapter :name "Dragonball Z" :sectionmap (sectionmap "Dragon Ball Villains" (section :name "Dragon Ball Villains" :unitmap (unitmap :Cell (unit :name "Cell" :image "Superheroes/Cell.png" :unitpowermap (unitpowermap "Cell Android" (unitpower :name "Cell Android" :level "32" :unitabilitymap (unitabilitymap "Imperfect Cell" (unitability :name "Imperfect Cell") "Second Form Cell" (unitability :name "Second Form Cell") "Perfect Cell" (unitability :name "Perfect Cell") "Super Perfect Cell" (unitability :name "Super Perfect Cell"))) :Spawning (unitpower :name "Spawning" :unitabilitymap (unitabilitymap "Copy Self" (unitability :name "Copy Self") :Offspring (unitability :name "Offspring"))))) :Cooler (unit :name "Cooler" :image "Superheroes/Cooler.png" :unitpowermap (unitpowermap :Friezas (unitpower :name "Friezas" :level "26" :unitabilitymap (unitabilitymap "Death Ball" (unitability :name "Death Ball") "Death Beam" (unitability :name "Death Beam") "Frieza Fourth Form" (unitability :name "Frieza Fourth Form") "Cooler Fifth Form" (unitability :name "Cooler Fifth Form"))) :Zenkai (unitpower :name "Zenkai" :unitabilitymap (unitabilitymap "Instant Transmission" (unitability :name "Instant Transmission"))))) :Frieza (unit :name "Frieza" :image "Superheroes/Frieza.png" :unitpowermap (unitpowermap :Friezas (unitpower :name "Friezas" :level "25" :unitabilitymap (unitabilitymap "Death Ball" (unitability :name "Death Ball") "Death Beam" (unitability :name "Death Beam") "Frieza First Form" (unitability :name "Frieza First Form") "Frieza Second Form" (unitability :name "Frieza Second Form") "Frieza Third Form" (unitability :name "Frieza Third Form") "Frieza Fourth Form" (unitability :name "Frieza Fourth Form"))) "Mind Over Matter" (unitpower :name "Mind Over Matter" :strength "10Mtons"))) "Kid Buu" (unit :name "Kid Buu" :image "Superheroes/KidBuu.png" :unitpowermap (unitpowermap :Flexible (unitpower :name "Flexible" :unitabilitymap (unitabilitymap "Arm Stretch" (unitability :name "Arm Stretch") "Body Stretch" (unitability :name "Body Stretch") "Bouncing Ball" (unitability :name "Bouncing Ball") :Engulf (unitability :name "Engulf") "Leg Stretch" (unitability :name "Leg Stretch"))) :Majins (unitpower :name "Majins" :level "35" :unitabilitymap (unitabilitymap "Chocolate Beam" (unitability :name "Chocolate Beam") "Kid Buu Form" (unitability :name "Kid Buu Form"))) :Spawning (unitpower :name "Spawning" :unitabilitymap (unitabilitymap "Copy Self" (unitability :name "Copy Self") "Detach Body Parts" (unitability :name "Detach Body Parts"))))) "Majin Buu" (unit :name "Majin Buu" :image "Superheroes/MajinBuu.png" :reference "Buu, along with his creator Bibidi and Babidi have names that are most likely references to the magic words the fairy god mother uses in Cinderella, 'Bibidi, Babidi, Boo!'." :unitpowermap (unitpowermap :Flexible (unitpower :name "Flexible" :unitabilitymap (unitabilitymap "Arm Stretch" (unitability :name "Arm Stretch") "Body Stretch" (unitability :name "Body Stretch") "Bouncing Ball" (unitability :name "Bouncing Ball") :Engulf (unitability :name "Engulf") "Leg Stretch" (unitability :name "Leg Stretch"))) :Majins (unitpower :name "Majins" :level "33" :unitabilitymap (unitabilitymap "Chocolate Beam" (unitability :name "Chocolate Beam") "Fat Buu Form" (unitability :name "Fat Buu Form"))) :Spawning (unitpower :name "Spawning" :unitabilitymap (unitabilitymap "Copy Self" (unitability :name "Copy Self") "Detach Body Parts" (unitability :name "Detach Body Parts"))))) :Nappa (unit :name "Nappa" :unitpowermap (unitpowermap :Saiyan (unitpower :name "Saiyan" :level "17"))) "Omega Shenron" (unit :name "Omega Shenron" :image "Superheroes/OmegaShenron.png") :Raditz (unit :name "Raditz" :unitpowermap (unitpowermap :Saiyan (unitpower :name "Saiyan" :level "15"))) :Saibaman (unit :name "Saibaman" :unitpowermap (unitpowermap :Zenkai (unitpower :name "Zenkai" :level "15"))))))) "Marvel Universe" (chapter :name "Marvel Universe" :sectionmap (sectionmap "Marvel X-men" (section :name "Marvel X-men" :unitmap (unitmap :Apocalypse (unit :name "Apocalypse" :image "Superheroes/Apocalypse.png" :unitpowermap (unitpowermap :Longevity (unitpower :name "Longevity" :unitabilitymap (unitabilitymap "Eternal Youth" (unitability :name "Eternal Youth")))) :unitskillmap (unitskillmap :Mastermind (unitskill :name "Mastermind"))) "Black Queen" (unit :name "Black Queen" :image "Superheroes/BlackQueen.png" :reference "* Shaw: Did you have to kill all of them, Selene? Selene: No, I didn't, but I thought.. 'If I wasn't meant to eat people, I'm sure they would have been made less delicious.'... I don't want to live in a happy paradise. I don't want to be freed from my terrible curse. I want to eat people. - Sebatian Shaw and Selene - Fall of X" :summary "* Life-Force Absorption: by psionically draining the life forces of other human beings into herself, by physical touch. If she drained a person's entire life force from him or her, the victim dies and the victim's body crumbles into dust. It is unknown how often Selene must drain life force from another human in order to survive. It is known, that great expenditure of power causes Selene to age, but she can rejuvenate herself by absorbing more life force. Selene will not age as long as she maintains her supply of absorbed life force. * Psychic Vampire: If Selene drains only part of a victims life force, Selene achieves a measure of psychic control over her victim's mind. Through unknown means, Selene can cause a human being to become a psychic vampire like herself, but be subordinate to Selene's own will. * Physical Enhancement: Selene has physical strength, stamina, speed, and reaction time that are all several times greater than those of a normal woman. * Superhuman Speed: ability to momentarily move at speeds rivaling those of Quicksilver. * Shadow-Morphing: allowing her to dematerialize or use solid tendrills of darkness to manipulate objects * Telekinetic Animation: can cause inanimate objects to move according to her will by projecting part of her absorbed life force into them. * Inanimate Disintegration: She can cause inanimate objects in her presence to disintegrate. She cannot, however, rearrange the atomic or molecular structure of matter. * Pyrokinesis: can psionically generate and project intense heat and flame from and around her body or direct it at certain distances. She was also able to manipulate flame created from other sources and could magnify their intensity or snuff them. The flames Selene generated could also be illusory in effect; for example, she could focus the power on an object making it appear to be on fire while it was not being damaged by the flames at all. Selene instinctively created a psionic force field about her entire body that protected her from the effects of the heat and flame she created and from other sources as well * Telepathy: capable of displaying various psionic feats with the minds of others including reading and communicating with thoughts over vast distances. * Psi-Screen: possesses a psychic mental shield to protect her from psychic attacks. * Mental Bolts: can project psionic force bolts which have no physical effects but which can affect a victim's mind so as to cause the victim pain or unconsciousness. * Hypnotic Trance: can induce a momentary hypnotic trance state in people around her. Often used along with her speed to create the illusion of teleportation. * Immortal: her aging process is greatly retarded and she can apparently regenerate injured or missing cells from even near-fatal injuries. * Rapid Healing: ability to endure injuries (within unknown limits) without lasting harm or even feeling pain such as knife wounds. * Sorcery: possesses considerable magical abilities, having gained a great deal of mystical knowledge over the millennia. The number of magical effects that she can create has yet to be cataloged, but it is known that she can cast and counteract spells and summon extra-dimensional demons. Selene appears to age as she uses magic. * Teleportation:" :titles "Selene Gallio" :unitpowermap (unitpowermap :Strength (unitpower :name "Strength" :strength "750kg") "Mind Over Matter" (unitpower :name "Mind Over Matter") :Longevity (unitpower :name "Longevity" :unitabilitymap (unitabilitymap "Eternal Youth" (unitability :name "Eternal Youth"))))) "Cyclops, X-man" (unit :name "Cyclops, X-man" :image "Superheroes/Cyclops.png" :summary "* His most powerful eye-blast is a beam 4 feet across which, at a distance of 50 feet, has a force of 500 pounds per square inch. * The beam's effective range is about 2,000 feet, at which point a 1-inch beam has spread out to 10 feet square, and then has a pressure of .38 pounds per square inch. Cyclops's maximum force is sufficient to tip over a filled 5,000 gallon tank at a distance of 20 feet, or puncture a 1-inch carbon-steel plate at a distance of 2 feet.") "Emma Frost" (unit :name "Emma Frost" :image "Superheroes/WhiteQueen.png" :reference "* There has never been a Scott who I couldn't make do whatever I wanted. - Emma Frost * Power is not what you are. Power is what you do. True queens are self-made, not appointed. And whether those who bestow the titles are gods, scientists or monarchs, Emma Frost kneels to no one... and everyone kneels to me. I am the divine Emma Frost and you've never been higher dying red-faced before me. - Emma Frost * Yes, WE rule the world. But the standard 'we' will go out of fashin soon enough... leaving the royal 'we' forever. - Emma Frost" :titles "White Queen") :Gambit (unit :name "Gambit" :image "Superheroes/Gambit.png") "Juggernaut, The" (unit :name "Juggernaut, The" :image "Superheroes/Juggernaut.png" :reference "* I'm the Juggernaut, Bitch! - Juggernaut, X-men 2" :unitpowermap (unitpowermap :Strength (unitpower :name "Strength" :strength "100tons") :Inertia (unitpower :name "Inertia" :unitabilitymap (unitabilitymap "Inertial Dampening" (unitability :name "Inertial Dampening") :Unstoppable (unitability :name "Unstoppable"))))) :Longshot (unit :name "Longshot" :image "Superheroes/Longshot.png") :Magneto (unit :name "Magneto" :image "Superheroes/Magneto.png" :unitpowermap (unitpowermap :Magnetism (unitpower :name "Magnetism" :strength "30ktons"))) :Mojo (unit :name "Mojo" :image "Superheroes/Mojo.png" :unitpowermap (unitpowermap :Longevity (unitpower :name "Longevity" :unitabilitymap (unitabilitymap "Eternal Youth" (unitability :name "Eternal Youth"))))) "Professor X" (unit :name "Professor X" :image "Superheroes/ProfessorX.png") :Psylocke (unit :name "Psylocke" :image "Superheroes/Psylocke.png") "Rogue, X-man" (unit :name "Rogue, X-man" :image "Superheroes/Rogue.png" :unitpowermap (unitpowermap :Strength (unitpower :name "Strength" :strength "50tons"))) :Sabretooth (unit :name "Sabretooth" :image "Superheroes/Sabretooth.png") :Spiral (unit :name "Spiral" :image "Superheroes/Spiral.png" :unitpowermap (unitpowermap :Longevity (unitpower :name "Longevity" :unitabilitymap (unitabilitymap "Long Life" (unitability :name "Long Life"))))) "Storm, X-man" (unit :name "Storm, X-man" :image "Superheroes/Storm.png") "Wolverine, The" (unit :name "Wolverine, The" :image "Superheroes/Wolverine.png" :unitpowermap (unitpowermap :Strength (unitpower :name "Strength" :strength "400kg") :Longevity (unitpower :name "Longevity" :unitabilitymap (unitabilitymap "Long Life" (unitability :name "Long Life"))))))))) "Original Groups" (chapter :name "Original Groups" :sectionmap (sectionmap :Extras (section :name "Extras" :unitmap (unitmap "Samantha Hellerton" (unit :name "Samantha Hellerton" :reference "I haven't been killed yet." :summary "* Miss Hellerton is an investigative reporter who will go to great lengths for a story. She has been kidnapped and shot at numerous times. She feels that getting directly involved gives her stories a personal and exclusive touch. She freelances for ABC radio and television in New York, and she makes a bundle for a good story. Her special reports are very popular, detailing her most recent adventures in the dangerous world of crime and power. To this end, she is always trying to top herself with increasingly risky and mindboggling news. Though she may seem sensationalist, she considers herself to be an excellent journalist and has no interest in altering or suppressing the facts. Her popularity and sincerity make her a favorite person to 'leak' information to. Her tendency to get into the thick of a situation maker her somewhat of a menace to superheroes. * She is very energetic and disorganized bordering on hyperactive. She has fantastic luck, great skill as a journalist, and some photographic talent. * She has many contacts around the world (not one of which is reliable). She dislikes her brother intensely." :titles "Sammy") "Samuel Timothy Hellerton" (unit :name "Samuel Timothy Hellerton" :reference "Let me get this straight ... Is is not true that? ... Just answer the question!" :summary "* Samuel Hellerton is a no-nonsense assistant D.A. He has built himself up from the bottom, is sickeningly straight, and is very dedicated to the Law. * He is generally calm and matter of fact. He nevers smile but is otherwise courteous and amiable. In court, however, he suddenly transforms into a merciless, abusive interrogator. * He does not get along well with his sister. He doesn't understand her, and she can't stand him. They are so used to fighting that they have rules about what is acceptable to throw at each other. * Samuel is a talented lawyer. He has mastered the give and take of the justice system. He is also skilled with the many firearms he keeps as a hobby (his house is like a gunlocker). He has many contacts: some rich, some powerful, many shady. Most are not reliable, but he knows which ones are." :titles "Sam, Assistant District Attorney Hellerton") "David Spencer Grant" (unit :name "David Spencer Grant" :summary "* Sergeant Grant is a middle-aged, highly decorated enigma. He has been a police officer for 23 years, a sergeant for 17, and has long ago given up on a promotion. Everyone on the force respects him, though few like him. * He has a macho image that he enforces to excess and is a card carrying male chauvanist pig. Socially, he can be obnoxious and irritating. For all his surly nature, he will do the right thing when the chips are down. * He is growing a pot belly, and he wears sunglasses even at night. He gave up smoking 2 years ago, but has never quite gotten over them." :titles "Sergeant Grant"))))))))
nx/tactics/books/superheroes / tacticsbook
Description:
Function Name:
  • tacticsbook
Return Type:
  • nx/tactics/base/book
Arguments:
  • Name
    Type
    Generic
    Description
Usage/Test Cases:
Source Code:
  • (func tacticsbook : base/book (book :name "Superheroes" :image "Superpowers.jpg" :chaptermap (chaptermap "Superheroes Overview" (chapter :name "Superheroes Overview" :sectionmap (sectionmap "Why Tactics: Superheroes?" (section :name "Why Tactics: Superheroes?"))) "Superhero Characters" (chapter :name "Superhero Characters" :sectionmap (sectionmap "Superhero Rules" (section :name "Superhero Rules" :rulemap (rulemap "Super Powers" (rule :name "Super Powers" :summary "* Superhero characters do not have a maximum Body, but their Combat Skills are limited to level 10 since they rely on their powers more than skill. * Superpowers include abilities from all other genres. Particularly relevent sections are: Magic, Martial Arts, Mentalism, Modern, and Ancients.") :Heroes (rule :name "Heroes" :summary "* Heroes live a life removed from normal men, yet they risk their lives to help others and battle evil. Their motives vary, but they are united in these common goals. * Many heroes hold themselves to a high standard, feeling that they must be better than the villians they pursue. Their reward is a greater acceptance and aid from the public, police, and other heroes. * Other heroes may use dubious tactics and may therefore be mistaken for villains. * Super Hero Teams - The most powerful of these may establish public bases.") :Villians (rule :name "Villians" :summary "* Villians, like heroes, are driven, but their desires are far different from herores. * Power lust, revenge, rage, greed, and insanity are the typical motivations for villians. * Super Villian Groups - Fortunately, the most powerful villians usually cannot get along, but many of the weaker villians see strength in numbers.") :Organizations (rule :name "Organizations" :summary "* Military - The study of superbeings has greatly advanced military science, so expect military units to possess exceptional equipment. * Special Agents - As with military advances, special agencies around the world have learned to adapt the a world of superbeings. Unlike the military, clandestine groups are not particularly effected by superbeings since their work is generally more subtle. Security, however, is difficult to maintain with powerful beings with telepathic and stealh powers roaming the world. * Crime - Criminal groups can gain huge advantages from villians, but that blade cuts both ways so any group dealing with such powerful allies always maintain contingency plans.") :Cliches (rule :name "Cliches" :reference "* Here's the plan. We get the warhead and we hold the world ransom for... ONE MILLION DOLLARS! - Dr. Evil, Austin Powers * Wait, aren't you even going to watch them? They could get away! No no no, I'm going to leave them alone and not actually witness them dying, I'm just gonna assume it all went to plan. What? - Dr. Evil, Austin Powers * He starts monologuing! He starts like, this prepared speech about how 'feeble' I am compared to him, how 'inevitable' my defeat is, how 'the world...will soon...be his'...I mean, the guy has me on a platter and he won't shut up! - Lucius, The Incredibles" :summary "* Superhero stories are loaded with cliches. The whole heroic adventure is a bit of cliche itself. * Conquer the World - Become so powerful that none can stand against you. * Blackmail - Destroy cities unless their demands are met. * Heist - Money is almost as strong a motivator for villians as power. * Having Fun - Villians enjoy their power and are not afraid to use it. Vandalism and displays of power give some villians a particular thrill. * Matching Wits - Some of the most egotistical villians feel that their victories would be too easy without pitting their own abilities against the heroes, and will actually tip their hands to force a confrontation. * Death Trap - Villians hate to see a hero die too quickly. Better to let them fully comprehend their defeat before they die. * Threatening Innocents - This is a favorite of villians as it underscores the difference between the heroes heroes and the villians. Some villians, however, find hiding behind bystanders to be cowardly. * Playing Possum - Often a villian may seem defeated, but often have a last trick up their sleeve. * Killing Allies - Villians love to punish their own. It shows how evil they are and is a great way to motivate others by showing the price of failure or rebellion. * Monologing - * Escape Routes - Villians somehow manage to escape certain death on a regular basis. They are always well prepared, and they also seem almost as lucky as the heroes."))))) "DC Universe" (chapter :name "DC Universe" :sectionmap (sectionmap :Villains (section :name "Villains" :unitmap (unitmap :Brainiac (unit :name "Brainiac" :image "Superheroes/Brainiac.png" :unitskillmap (unitskillmap :Mastermind (unitskill :name "Mastermind"))) :Catwoman (unit :name "Catwoman" :image "Superheroes/Catwoman.png") :Darkseid (unit :name "Darkseid" :image "Superheroes/Darkseid.png" :unitskillmap (unitskillmap :Mastermind (unitskill :name "Mastermind"))) :Joker (unit :name "Joker" :image "Superheroes/Joker.png" :summary "* You won't kill me out of some misplaced sense of self-righteousness, and I won't kill you because you're just too much fun. I think you and I are destined to do this forever." :unitskillmap (unitskillmap :Mastermind (unitskill :name "Mastermind"))) :Sinestro (unit :name "Sinestro" :image "Superheroes/Sinestro.png"))))) "Dragonball Z" (chapter :name "Dragonball Z" :sectionmap (sectionmap "Dragon Ball Villains" (section :name "Dragon Ball Villains" :unitmap (unitmap :Cell (unit :name "Cell" :image "Superheroes/Cell.png" :unitpowermap (unitpowermap "Cell Android" (unitpower :name "Cell Android" :level "32" :unitabilitymap (unitabilitymap "Imperfect Cell" (unitability :name "Imperfect Cell") "Second Form Cell" (unitability :name "Second Form Cell") "Perfect Cell" (unitability :name "Perfect Cell") "Super Perfect Cell" (unitability :name "Super Perfect Cell"))) :Spawning (unitpower :name "Spawning" :unitabilitymap (unitabilitymap "Copy Self" (unitability :name "Copy Self") :Offspring (unitability :name "Offspring"))))) :Cooler (unit :name "Cooler" :image "Superheroes/Cooler.png" :unitpowermap (unitpowermap :Friezas (unitpower :name "Friezas" :level "26" :unitabilitymap (unitabilitymap "Death Ball" (unitability :name "Death Ball") "Death Beam" (unitability :name "Death Beam") "Frieza Fourth Form" (unitability :name "Frieza Fourth Form") "Cooler Fifth Form" (unitability :name "Cooler Fifth Form"))) :Zenkai (unitpower :name "Zenkai" :unitabilitymap (unitabilitymap "Instant Transmission" (unitability :name "Instant Transmission"))))) :Frieza (unit :name "Frieza" :image "Superheroes/Frieza.png" :unitpowermap (unitpowermap :Friezas (unitpower :name "Friezas" :level "25" :unitabilitymap (unitabilitymap "Death Ball" (unitability :name "Death Ball") "Death Beam" (unitability :name "Death Beam") "Frieza First Form" (unitability :name "Frieza First Form") "Frieza Second Form" (unitability :name "Frieza Second Form") "Frieza Third Form" (unitability :name "Frieza Third Form") "Frieza Fourth Form" (unitability :name "Frieza Fourth Form"))) "Mind Over Matter" (unitpower :name "Mind Over Matter" :strength "10Mtons"))) "Kid Buu" (unit :name "Kid Buu" :image "Superheroes/KidBuu.png" :unitpowermap (unitpowermap :Flexible (unitpower :name "Flexible" :unitabilitymap (unitabilitymap "Arm Stretch" (unitability :name "Arm Stretch") "Body Stretch" (unitability :name "Body Stretch") "Bouncing Ball" (unitability :name "Bouncing Ball") :Engulf (unitability :name "Engulf") "Leg Stretch" (unitability :name "Leg Stretch"))) :Majins (unitpower :name "Majins" :level "35" :unitabilitymap (unitabilitymap "Chocolate Beam" (unitability :name "Chocolate Beam") "Kid Buu Form" (unitability :name "Kid Buu Form"))) :Spawning (unitpower :name "Spawning" :unitabilitymap (unitabilitymap "Copy Self" (unitability :name "Copy Self") "Detach Body Parts" (unitability :name "Detach Body Parts"))))) "Majin Buu" (unit :name "Majin Buu" :image "Superheroes/MajinBuu.png" :reference "Buu, along with his creator Bibidi and Babidi have names that are most likely references to the magic words the fairy god mother uses in Cinderella, 'Bibidi, Babidi, Boo!'." :unitpowermap (unitpowermap :Flexible (unitpower :name "Flexible" :unitabilitymap (unitabilitymap "Arm Stretch" (unitability :name "Arm Stretch") "Body Stretch" (unitability :name "Body Stretch") "Bouncing Ball" (unitability :name "Bouncing Ball") :Engulf (unitability :name "Engulf") "Leg Stretch" (unitability :name "Leg Stretch"))) :Majins (unitpower :name "Majins" :level "33" :unitabilitymap (unitabilitymap "Chocolate Beam" (unitability :name "Chocolate Beam") "Fat Buu Form" (unitability :name "Fat Buu Form"))) :Spawning (unitpower :name "Spawning" :unitabilitymap (unitabilitymap "Copy Self" (unitability :name "Copy Self") "Detach Body Parts" (unitability :name "Detach Body Parts"))))) :Nappa (unit :name "Nappa" :unitpowermap (unitpowermap :Saiyan (unitpower :name "Saiyan" :level "17"))) "Omega Shenron" (unit :name "Omega Shenron" :image "Superheroes/OmegaShenron.png") :Raditz (unit :name "Raditz" :unitpowermap (unitpowermap :Saiyan (unitpower :name "Saiyan" :level "15"))) :Saibaman (unit :name "Saibaman" :unitpowermap (unitpowermap :Zenkai (unitpower :name "Zenkai" :level "15"))))))) "Marvel Universe" (chapter :name "Marvel Universe" :sectionmap (sectionmap "Marvel X-men" (section :name "Marvel X-men" :unitmap (unitmap :Apocalypse (unit :name "Apocalypse" :image "Superheroes/Apocalypse.png" :unitpowermap (unitpowermap :Longevity (unitpower :name "Longevity" :unitabilitymap (unitabilitymap "Eternal Youth" (unitability :name "Eternal Youth")))) :unitskillmap (unitskillmap :Mastermind (unitskill :name "Mastermind"))) "Black Queen" (unit :name "Black Queen" :image "Superheroes/BlackQueen.png" :reference "* Shaw: Did you have to kill all of them, Selene? Selene: No, I didn't, but I thought.. 'If I wasn't meant to eat people, I'm sure they would have been made less delicious.'... I don't want to live in a happy paradise. I don't want to be freed from my terrible curse. I want to eat people. - Sebatian Shaw and Selene - Fall of X" :summary "* Life-Force Absorption: by psionically draining the life forces of other human beings into herself, by physical touch. If she drained a person's entire life force from him or her, the victim dies and the victim's body crumbles into dust. It is unknown how often Selene must drain life force from another human in order to survive. It is known, that great expenditure of power causes Selene to age, but she can rejuvenate herself by absorbing more life force. Selene will not age as long as she maintains her supply of absorbed life force. * Psychic Vampire: If Selene drains only part of a victims life force, Selene achieves a measure of psychic control over her victim's mind. Through unknown means, Selene can cause a human being to become a psychic vampire like herself, but be subordinate to Selene's own will. * Physical Enhancement: Selene has physical strength, stamina, speed, and reaction time that are all several times greater than those of a normal woman. * Superhuman Speed: ability to momentarily move at speeds rivaling those of Quicksilver. * Shadow-Morphing: allowing her to dematerialize or use solid tendrills of darkness to manipulate objects * Telekinetic Animation: can cause inanimate objects to move according to her will by projecting part of her absorbed life force into them. * Inanimate Disintegration: She can cause inanimate objects in her presence to disintegrate. She cannot, however, rearrange the atomic or molecular structure of matter. * Pyrokinesis: can psionically generate and project intense heat and flame from and around her body or direct it at certain distances. She was also able to manipulate flame created from other sources and could magnify their intensity or snuff them. The flames Selene generated could also be illusory in effect; for example, she could focus the power on an object making it appear to be on fire while it was not being damaged by the flames at all. Selene instinctively created a psionic force field about her entire body that protected her from the effects of the heat and flame she created and from other sources as well * Telepathy: capable of displaying various psionic feats with the minds of others including reading and communicating with thoughts over vast distances. * Psi-Screen: possesses a psychic mental shield to protect her from psychic attacks. * Mental Bolts: can project psionic force bolts which have no physical effects but which can affect a victim's mind so as to cause the victim pain or unconsciousness. * Hypnotic Trance: can induce a momentary hypnotic trance state in people around her. Often used along with her speed to create the illusion of teleportation. * Immortal: her aging process is greatly retarded and she can apparently regenerate injured or missing cells from even near-fatal injuries. * Rapid Healing: ability to endure injuries (within unknown limits) without lasting harm or even feeling pain such as knife wounds. * Sorcery: possesses considerable magical abilities, having gained a great deal of mystical knowledge over the millennia. The number of magical effects that she can create has yet to be cataloged, but it is known that she can cast and counteract spells and summon extra-dimensional demons. Selene appears to age as she uses magic. * Teleportation:" :titles "Selene Gallio" :unitpowermap (unitpowermap :Strength (unitpower :name "Strength" :strength "750kg") "Mind Over Matter" (unitpower :name "Mind Over Matter") :Longevity (unitpower :name "Longevity" :unitabilitymap (unitabilitymap "Eternal Youth" (unitability :name "Eternal Youth"))))) "Cyclops, X-man" (unit :name "Cyclops, X-man" :image "Superheroes/Cyclops.png" :summary "* His most powerful eye-blast is a beam 4 feet across which, at a distance of 50 feet, has a force of 500 pounds per square inch. * The beam's effective range is about 2,000 feet, at which point a 1-inch beam has spread out to 10 feet square, and then has a pressure of .38 pounds per square inch. Cyclops's maximum force is sufficient to tip over a filled 5,000 gallon tank at a distance of 20 feet, or puncture a 1-inch carbon-steel plate at a distance of 2 feet.") "Emma Frost" (unit :name "Emma Frost" :image "Superheroes/WhiteQueen.png" :reference "* There has never been a Scott who I couldn't make do whatever I wanted. - Emma Frost * Power is not what you are. Power is what you do. True queens are self-made, not appointed. And whether those who bestow the titles are gods, scientists or monarchs, Emma Frost kneels to no one... and everyone kneels to me. I am the divine Emma Frost and you've never been higher dying red-faced before me. - Emma Frost * Yes, WE rule the world. But the standard 'we' will go out of fashin soon enough... leaving the royal 'we' forever. - Emma Frost" :titles "White Queen") :Gambit (unit :name "Gambit" :image "Superheroes/Gambit.png") "Juggernaut, The" (unit :name "Juggernaut, The" :image "Superheroes/Juggernaut.png" :reference "* I'm the Juggernaut, Bitch! - Juggernaut, X-men 2" :unitpowermap (unitpowermap :Strength (unitpower :name "Strength" :strength "100tons") :Inertia (unitpower :name "Inertia" :unitabilitymap (unitabilitymap "Inertial Dampening" (unitability :name "Inertial Dampening") :Unstoppable (unitability :name "Unstoppable"))))) :Longshot (unit :name "Longshot" :image "Superheroes/Longshot.png") :Magneto (unit :name "Magneto" :image "Superheroes/Magneto.png" :unitpowermap (unitpowermap :Magnetism (unitpower :name "Magnetism" :strength "30ktons"))) :Mojo (unit :name "Mojo" :image "Superheroes/Mojo.png" :unitpowermap (unitpowermap :Longevity (unitpower :name "Longevity" :unitabilitymap (unitabilitymap "Eternal Youth" (unitability :name "Eternal Youth"))))) "Professor X" (unit :name "Professor X" :image "Superheroes/ProfessorX.png") :Psylocke (unit :name "Psylocke" :image "Superheroes/Psylocke.png") "Rogue, X-man" (unit :name "Rogue, X-man" :image "Superheroes/Rogue.png" :unitpowermap (unitpowermap :Strength (unitpower :name "Strength" :strength "50tons"))) :Sabretooth (unit :name "Sabretooth" :image "Superheroes/Sabretooth.png") :Spiral (unit :name "Spiral" :image "Superheroes/Spiral.png" :unitpowermap (unitpowermap :Longevity (unitpower :name "Longevity" :unitabilitymap (unitabilitymap "Long Life" (unitability :name "Long Life"))))) "Storm, X-man" (unit :name "Storm, X-man" :image "Superheroes/Storm.png") "Wolverine, The" (unit :name "Wolverine, The" :image "Superheroes/Wolverine.png" :unitpowermap (unitpowermap :Strength (unitpower :name "Strength" :strength "400kg") :Longevity (unitpower :name "Longevity" :unitabilitymap (unitabilitymap "Long Life" (unitability :name "Long Life"))))))))) "Original Groups" (chapter :name "Original Groups" :sectionmap (sectionmap :Extras (section :name "Extras" :unitmap (unitmap "Samantha Hellerton" (unit :name "Samantha Hellerton" :reference "I haven't been killed yet." :summary "* Miss Hellerton is an investigative reporter who will go to great lengths for a story. She has been kidnapped and shot at numerous times. She feels that getting directly involved gives her stories a personal and exclusive touch. She freelances for ABC radio and television in New York, and she makes a bundle for a good story. Her special reports are very popular, detailing her most recent adventures in the dangerous world of crime and power. To this end, she is always trying to top herself with increasingly risky and mindboggling news. Though she may seem sensationalist, she considers herself to be an excellent journalist and has no interest in altering or suppressing the facts. Her popularity and sincerity make her a favorite person to 'leak' information to. Her tendency to get into the thick of a situation maker her somewhat of a menace to superheroes. * She is very energetic and disorganized bordering on hyperactive. She has fantastic luck, great skill as a journalist, and some photographic talent. * She has many contacts around the world (not one of which is reliable). She dislikes her brother intensely." :titles "Sammy") "Samuel Timothy Hellerton" (unit :name "Samuel Timothy Hellerton" :reference "Let me get this straight ... Is is not true that? ... Just answer the question!" :summary "* Samuel Hellerton is a no-nonsense assistant D.A. He has built himself up from the bottom, is sickeningly straight, and is very dedicated to the Law. * He is generally calm and matter of fact. He nevers smile but is otherwise courteous and amiable. In court, however, he suddenly transforms into a merciless, abusive interrogator. * He does not get along well with his sister. He doesn't understand her, and she can't stand him. They are so used to fighting that they have rules about what is acceptable to throw at each other. * Samuel is a talented lawyer. He has mastered the give and take of the justice system. He is also skilled with the many firearms he keeps as a hobby (his house is like a gunlocker). He has many contacts: some rich, some powerful, many shady. Most are not reliable, but he knows which ones are." :titles "Sam, Assistant District Attorney Hellerton") "David Spencer Grant" (unit :name "David Spencer Grant" :summary "* Sergeant Grant is a middle-aged, highly decorated enigma. He has been a police officer for 23 years, a sergeant for 17, and has long ago given up on a promotion. Everyone on the force respects him, though few like him. * He has a macho image that he enforces to excess and is a card carrying male chauvanist pig. Socially, he can be obnoxious and irritating. For all his surly nature, he will do the right thing when the chips are down. * He is growing a pot belly, and he wears sunglasses even at night. He gave up smoking 2 years ago, but has never quite gotten over them." :titles "Sergeant Grant"))))))))
nx/tactics/damage
Description:
  • Tactics Damage Decks
Package Name:
  • nx/tactics/damage
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
    base
    nx/tactics/base
Types:
  • wound
Constants:
  • breakdown, duress, fatigue, stagger, stress, trauma, irrationaldeck, unwillingdeck, wounddeck, wound-j1, wound-j2, wound-ca, wound-da, wound-ha, wound-sa, wound-sk, wound-sq, wound-sj, wound-s10, wound-s9, wound-s8, wound-s7, wound-s6, wound-s5, wound-s4, wound-s3, wound-s2
Functions:
Source Code:
  • (package nx/tactics/damage :libs (lib base :path nx/tactics/base) :doc "Tactics Damage Decks") (type wound : struct :traits [base/card] :doc "Lasting Body Damage") (const breakdown : base/card (base/card :name "Breakdown") :doc "Lasting Mind Damage") (const duress : base/card (base/card :name "Duress" :titles "Doubt") :doc "* Temporary Will Damage/Fear/Horror. Doing things against your beliefs causes Duress. * While you have more Duress than Will, you are Shaken. * Shaken: Cannot play odd [Defend] cards and your second action may only be [Recover]") (const fatigue : base/card (base/card :name "Fatigue") :doc "* Temporary Body Damage. Hard work and strikes in combat cause Fatigue. * While you have more Fatigue than [Body], you are Exhausted. * Exhausted: Cannot play odd [Attack] cards and your second action may only be [Recover].") (const stagger : base/card (base/card :name "Stagger") :doc "* Temporary Speed Damage/Restraint. * While you have more Stagger than [Speed], you are Slowed. * Slowed: [Move] actions are halved (rounded up).") (const stress : base/card (base/card :name "Stress") :doc "* Temporary Mind Damage/Distraction/Surprise/Shock. * While you have more Stress than [Mind], you are Stunned. * Stunned: Cannot play odd [Focus] cards and your second action may only be [Recover].") (const trauma : base/card :doc "Lasting Will Damage") (const irrationaldeck : base/deck (base/deck :name "Irrational" :titles "Crazed, Insane, Nonsensical, Obsessed, Unhinged" :summary "* S-Hack Blood/Gore/Dismember/Doubt * H-Slash Blood/Slow * C-Bash/Fatigue/Push * D-Pierce/Shock/Stun/Pin/Disable/Stress") :doc "Damage to the Mind") (const unwillingdeck : base/deck (base/deck :name "Unwilling" :titles "Apathy, Cowed, Berserk, Broken, Depression, Servitude, Surly" :summary "* S-Hack Blood/Gore/Dismember * H-Slash Blood/Slow * C-Bash/Fatigue/Push * D-Pierce/Stun/Pin/Disable") :doc "Damage to the Will") (const wounddeck : base/deck (base/deck :name "Wound Deck" :summary "* S-Hack Blood/Gore/Dismember * H-Slash Blood/Slow * C-Bash/Fatigue/Push * D-Stab/Pierce/Stun/Pin/Disable" :cardlist (base/cardlist wound-j1 wound-j2 wound-ca wound-da wound-ha wound-sa wound-sk wound-sq wound-sj wound-s5 wound-s4 wound-s3 wound-s2)) :doc "Physical Damage Deck") (const wound-j1 : wound (wound :name "Wild" :doc "* Search the Deck for any card and play that instead. * Shuffle Discards into Deck.")) (const wound-j2 : wound (wound :name "Wild" :doc "* Search the Discards for any card and play that instead or play the next card instead. * Shuffle Discards into Deck.")) (const wound-ca : wound (wound :name "Bash: Head" :rank base/rank-ace :suit base/suit-club :doc "* 1 Damage: Head Ringing. [Stun]: 1. * 2 Damage: Concussion. [Fatigue]: 1. [Push]: 1. * 3 Damage: Skull Fracture. [Unconscious]. [Fatigue]: 2. [Push]: 1. [Knockdown]: 1. * 4 Damage: Skull Crushed. [Dead].")) (const wound-da : wound (wound :name "Pierce: Head" :rank base/rank-ace :suit base/suit-diamond :doc "* 1 Damage: Head Grazed. [Stun]: 1. * 2 Damage: Pierced Throat. [Can't speak]. [Stun]: 1. * 3 Damage: Blinded in one Eye. [Partly Blind]. [Stun]: 2. [Horror]: 1. * 4 Damage: Skull Pierced. Dying.")) (const wound-ha : wound (wound :name "Slash: Head" :rank base/rank-ace :suit base/suit-heart :doc "* 1 Damage: Head Cut. [Bleeding]: 1. * 2 Damage: Face Gash. [Horror]: 1. [Bleeding]: 1. * 3 Damage: Throat Sliced Open. [Bleeding]: 3, [Horror]: 2. * 4 Damage: Spine Severed. [Paralyzed]. [Horror]: 3. [Bleeding]: 2.")) (const wound-sa : wound (wound :name "Hack: Head/Neck/Face/Skull" :rank base/rank-ace :suit base/suit-spade :doc "1 Damage: Deflected off Skull. [Slow]: 1. 2 Damage: Head Slash. [Slow]: 1. [Bleeding]: 1. 3 Damage: Neck Fracture. [Immobilized]. [Slow]: 2. [Bleeding]: 1. 4 Damage: Head Severed. [Dead].")) (const wound-sk : wound (wound :doc "Hack: Upper Chest/Upper Back/Shoulders/Ribs")) (const wound-sq : wound (wound :doc "Hack: Lower Chest/Middle Back/Lungs/Heart")) (const wound-sj : wound (wound :doc "Hack: Abdomen/Lower Back")) (const wound-s10 : wound (wound :doc "Hack: Hips/Groin")) (const wound-s9 : wound (wound :doc "Hack: Right Upper Arm/Elbow")) (const wound-s8 : wound (wound :doc "Hack: Left Upper Arm/Elbow")) (const wound-s7 : wound (wound :doc "Hack: Right Lower Arm/Wrist/Hand")) (const wound-s6 : wound (wound :doc "Hack: Left Lower Arm/Wrist/Hand")) (const wound-s5 : wound (wound :doc "Hack: Right Upper Leg/Thigh/Knee")) (const wound-s4 : wound (wound :doc "Hack: Left Upper Leg/Thigh/Knee")) (const wound-s3 : base/damage (base/damage :doc "Hack: Right Lower Leg/Shin/Ankle/Foot")) (const wound-s2 : wound (wound :doc "Hack: Left Lower Leg/Shin/Ankle/Foot"))
nx/tactics/damage / wound
Description:
  • Lasting Body Damage
Type Name:
  • wound
Extends:
  • :struct
Default:
Usage/Test Cases:
Source Code:
  • (type wound : struct :traits [base/card] :doc "Lasting Body Damage")
nx/tactics/damage / breakdown
Description:
  • Lasting Mind Damage
Constant Name:
  • breakdown
Type:
  • nx/tactics/base/card
Usage/Test Cases:
Source Code:
  • (const breakdown : base/card (base/card :name "Breakdown") :doc "Lasting Mind Damage")
nx/tactics/damage / duress
Description:
  • * Temporary Will Damage/Fear/Horror. Doing things against your beliefs causes Duress. * While you have more Duress than Will, you are Shaken. * Shaken: Cannot play odd [Defend] cards and your second action may only be [Recover]
Constant Name:
  • duress
Type:
  • nx/tactics/base/card
Usage/Test Cases:
Source Code:
  • (const duress : base/card (base/card :name "Duress" :titles "Doubt") :doc "* Temporary Will Damage/Fear/Horror. Doing things against your beliefs causes Duress. * While you have more Duress than Will, you are Shaken. * Shaken: Cannot play odd [Defend] cards and your second action may only be [Recover]")
nx/tactics/damage / fatigue
Description:
  • * Temporary Body Damage. Hard work and strikes in combat cause Fatigue. * While you have more Fatigue than [Body], you are Exhausted. * Exhausted: Cannot play odd [Attack] cards and your second action may only be [Recover].
Constant Name:
  • fatigue
Type:
  • nx/tactics/base/card
Usage/Test Cases:
Source Code:
  • (const fatigue : base/card (base/card :name "Fatigue") :doc "* Temporary Body Damage. Hard work and strikes in combat cause Fatigue. * While you have more Fatigue than [Body], you are Exhausted. * Exhausted: Cannot play odd [Attack] cards and your second action may only be [Recover].")
nx/tactics/damage / stagger
Description:
  • * Temporary Speed Damage/Restraint. * While you have more Stagger than [Speed], you are Slowed. * Slowed: [Move] actions are halved (rounded up).
Constant Name:
  • stagger
Type:
  • nx/tactics/base/card
Usage/Test Cases:
Source Code:
  • (const stagger : base/card (base/card :name "Stagger") :doc "* Temporary Speed Damage/Restraint. * While you have more Stagger than [Speed], you are Slowed. * Slowed: [Move] actions are halved (rounded up).")
nx/tactics/damage / stress
Description:
  • * Temporary Mind Damage/Distraction/Surprise/Shock. * While you have more Stress than [Mind], you are Stunned. * Stunned: Cannot play odd [Focus] cards and your second action may only be [Recover].
Constant Name:
  • stress
Type:
  • nx/tactics/base/card
Usage/Test Cases:
Source Code:
  • (const stress : base/card (base/card :name "Stress") :doc "* Temporary Mind Damage/Distraction/Surprise/Shock. * While you have more Stress than [Mind], you are Stunned. * Stunned: Cannot play odd [Focus] cards and your second action may only be [Recover].")
nx/tactics/damage / trauma
Description:
  • Lasting Will Damage
Constant Name:
  • trauma
Type:
  • nx/tactics/base/card
Usage/Test Cases:
Source Code:
  • (const trauma : base/card :doc "Lasting Will Damage")
nx/tactics/damage / irrationaldeck
Description:
  • Damage to the Mind
Constant Name:
  • irrationaldeck
Type:
  • nx/tactics/base/deck
Usage/Test Cases:
Source Code:
  • (const irrationaldeck : base/deck (base/deck :name "Irrational" :titles "Crazed, Insane, Nonsensical, Obsessed, Unhinged" :summary "* S-Hack Blood/Gore/Dismember/Doubt * H-Slash Blood/Slow * C-Bash/Fatigue/Push * D-Pierce/Shock/Stun/Pin/Disable/Stress") :doc "Damage to the Mind")
nx/tactics/damage / unwillingdeck
Description:
  • Damage to the Will
Constant Name:
  • unwillingdeck
Type:
  • nx/tactics/base/deck
Usage/Test Cases:
Source Code:
  • (const unwillingdeck : base/deck (base/deck :name "Unwilling" :titles "Apathy, Cowed, Berserk, Broken, Depression, Servitude, Surly" :summary "* S-Hack Blood/Gore/Dismember * H-Slash Blood/Slow * C-Bash/Fatigue/Push * D-Pierce/Stun/Pin/Disable") :doc "Damage to the Will")
nx/tactics/damage / wounddeck
Description:
  • Physical Damage Deck
Constant Name:
  • wounddeck
Type:
  • nx/tactics/base/deck
Usage/Test Cases:
Source Code:
  • (const wounddeck : base/deck (base/deck :name "Wound Deck" :summary "* S-Hack Blood/Gore/Dismember * H-Slash Blood/Slow * C-Bash/Fatigue/Push * D-Stab/Pierce/Stun/Pin/Disable" :cardlist (base/cardlist wound-j1 wound-j2 wound-ca wound-da wound-ha wound-sa wound-sk wound-sq wound-sj wound-s5 wound-s4 wound-s3 wound-s2)) :doc "Physical Damage Deck")
nx/tactics/damage / wound-j1
Description:
Constant Name:
  • wound-j1
Type:
  • nx/tactics/damage/wound
Usage/Test Cases:
Source Code:
  • (const wound-j1 : wound (wound :name "Wild" :doc "* Search the Deck for any card and play that instead. * Shuffle Discards into Deck."))
nx/tactics/damage / wound-j2
Description:
Constant Name:
  • wound-j2
Type:
  • nx/tactics/damage/wound
Usage/Test Cases:
Source Code:
  • (const wound-j2 : wound (wound :name "Wild" :doc "* Search the Discards for any card and play that instead or play the next card instead. * Shuffle Discards into Deck."))
nx/tactics/damage / wound-ca
Description:
Constant Name:
  • wound-ca
Type:
  • nx/tactics/damage/wound
Usage/Test Cases:
Source Code:
  • (const wound-ca : wound (wound :name "Bash: Head" :rank base/rank-ace :suit base/suit-club :doc "* 1 Damage: Head Ringing. [Stun]: 1. * 2 Damage: Concussion. [Fatigue]: 1. [Push]: 1. * 3 Damage: Skull Fracture. [Unconscious]. [Fatigue]: 2. [Push]: 1. [Knockdown]: 1. * 4 Damage: Skull Crushed. [Dead]."))
nx/tactics/damage / wound-da
Description:
Constant Name:
  • wound-da
Type:
  • nx/tactics/damage/wound
Usage/Test Cases:
Source Code:
  • (const wound-da : wound (wound :name "Pierce: Head" :rank base/rank-ace :suit base/suit-diamond :doc "* 1 Damage: Head Grazed. [Stun]: 1. * 2 Damage: Pierced Throat. [Can't speak]. [Stun]: 1. * 3 Damage: Blinded in one Eye. [Partly Blind]. [Stun]: 2. [Horror]: 1. * 4 Damage: Skull Pierced. Dying."))
nx/tactics/damage / wound-ha
Description:
Constant Name:
  • wound-ha
Type:
  • nx/tactics/damage/wound
Usage/Test Cases:
Source Code:
  • (const wound-ha : wound (wound :name "Slash: Head" :rank base/rank-ace :suit base/suit-heart :doc "* 1 Damage: Head Cut. [Bleeding]: 1. * 2 Damage: Face Gash. [Horror]: 1. [Bleeding]: 1. * 3 Damage: Throat Sliced Open. [Bleeding]: 3, [Horror]: 2. * 4 Damage: Spine Severed. [Paralyzed]. [Horror]: 3. [Bleeding]: 2."))
nx/tactics/damage / wound-sa
Description:
Constant Name:
  • wound-sa
Type:
  • nx/tactics/damage/wound
Usage/Test Cases:
Source Code:
  • (const wound-sa : wound (wound :name "Hack: Head/Neck/Face/Skull" :rank base/rank-ace :suit base/suit-spade :doc "1 Damage: Deflected off Skull. [Slow]: 1. 2 Damage: Head Slash. [Slow]: 1. [Bleeding]: 1. 3 Damage: Neck Fracture. [Immobilized]. [Slow]: 2. [Bleeding]: 1. 4 Damage: Head Severed. [Dead]."))
nx/tactics/damage / wound-sk
Description:
Constant Name:
  • wound-sk
Type:
  • nx/tactics/damage/wound
Usage/Test Cases:
Source Code:
  • (const wound-sk : wound (wound :doc "Hack: Upper Chest/Upper Back/Shoulders/Ribs"))
nx/tactics/damage / wound-sq
Description:
Constant Name:
  • wound-sq
Type:
  • nx/tactics/damage/wound
Usage/Test Cases:
Source Code:
  • (const wound-sq : wound (wound :doc "Hack: Lower Chest/Middle Back/Lungs/Heart"))
nx/tactics/damage / wound-sj
Description:
Constant Name:
  • wound-sj
Type:
  • nx/tactics/damage/wound
Usage/Test Cases:
Source Code:
  • (const wound-sj : wound (wound :doc "Hack: Abdomen/Lower Back"))
nx/tactics/damage / wound-s10
Description:
Constant Name:
  • wound-s10
Type:
  • nx/tactics/damage/wound
Usage/Test Cases:
Source Code:
  • (const wound-s10 : wound (wound :doc "Hack: Hips/Groin"))
nx/tactics/damage / wound-s9
Description:
Constant Name:
  • wound-s9
Type:
  • nx/tactics/damage/wound
Usage/Test Cases:
Source Code:
  • (const wound-s9 : wound (wound :doc "Hack: Right Upper Arm/Elbow"))
nx/tactics/damage / wound-s8
Description:
Constant Name:
  • wound-s8
Type:
  • nx/tactics/damage/wound
Usage/Test Cases:
Source Code:
  • (const wound-s8 : wound (wound :doc "Hack: Left Upper Arm/Elbow"))
nx/tactics/damage / wound-s7
Description:
Constant Name:
  • wound-s7
Type:
  • nx/tactics/damage/wound
Usage/Test Cases:
Source Code:
  • (const wound-s7 : wound (wound :doc "Hack: Right Lower Arm/Wrist/Hand"))
nx/tactics/damage / wound-s6
Description:
Constant Name:
  • wound-s6
Type:
  • nx/tactics/damage/wound
Usage/Test Cases:
Source Code:
  • (const wound-s6 : wound (wound :doc "Hack: Left Lower Arm/Wrist/Hand"))
nx/tactics/damage / wound-s5
Description:
Constant Name:
  • wound-s5
Type:
  • nx/tactics/damage/wound
Usage/Test Cases:
Source Code:
  • (const wound-s5 : wound (wound :doc "Hack: Right Upper Leg/Thigh/Knee"))
nx/tactics/damage / wound-s4
Description:
Constant Name:
  • wound-s4
Type:
  • nx/tactics/damage/wound
Usage/Test Cases:
Source Code:
  • (const wound-s4 : wound (wound :doc "Hack: Left Upper Leg/Thigh/Knee"))
nx/tactics/damage / wound-s3
Description:
Constant Name:
  • wound-s3
Type:
  • nx/tactics/base/damage
Usage/Test Cases:
Source Code:
  • (const wound-s3 : base/damage (base/damage :doc "Hack: Right Lower Leg/Shin/Ankle/Foot"))
nx/tactics/damage / wound-s2
Description:
Constant Name:
  • wound-s2
Type:
  • nx/tactics/damage/wound
Usage/Test Cases:
Source Code:
  • (const wound-s2 : wound (wound :doc "Hack: Left Lower Leg/Shin/Ankle/Foot"))
vx/ui/appui
Description:
Package Name:
  • vx/ui/appui
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
Types:
Constants:
Functions:
Source Code:
  • (package vx/ui/appui)
vx/ui/background
Description:
Package Name:
  • vx/ui/background
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
Types:
Constants:
Functions:
Source Code:
  • (package vx/ui/background)
vx/ui/element
Description:
Package Name:
  • vx/ui/element
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
Types:
  • element, orientation, point, pointlist, style
Constants:
Functions:
Source Code:
  • (package vx/ui/element) (type element : struct :properties [name : string style : style]) (type orientation : struct :properties [rotate-x : float rotate-y : float rotate-z : float]) (type point : struct :properties [x : float y : float z : float]) (type pointlist : list :allowtypes [point]) (type style : struct :properties [name : string pointlist : pointlist orientation : orientation])
vx/ui/element / element
Description:
Type Name:
  • element
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    name
    vx/core/string
    false
    false
    style
    vx/ui/element/style
    false
    false
Usage/Test Cases:
Source Code:
  • (type element : struct :properties [name : string style : style])
vx/ui/element / orientation
Description:
Type Name:
  • orientation
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    rotate-x
    vx/core/float
    false
    false
    rotate-y
    vx/core/float
    false
    false
    rotate-z
    vx/core/float
    false
    false
Usage/Test Cases:
Source Code:
  • (type orientation : struct :properties [rotate-x : float rotate-y : float rotate-z : float])
vx/ui/element / point
Description:
Type Name:
  • point
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    x
    vx/core/float
    false
    false
    y
    vx/core/float
    false
    false
    z
    vx/core/float
    false
    false
Usage/Test Cases:
Source Code:
  • (type point : struct :properties [x : float y : float z : float])
vx/ui/element / pointlist
Description:
Type Name:
  • pointlist
Extends:
  • :list
Default:
Allowed Types:
  • point
Usage/Test Cases:
Source Code:
  • (type pointlist : list :allowtypes [point])
vx/ui/element / style
Description:
Type Name:
  • style
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    name
    vx/core/string
    false
    false
    pointlist
    vx/ui/element/pointlist
    false
    false
    orientation
    vx/ui/element/orientation
    false
    false
Usage/Test Cases:
Source Code:
  • (type style : struct :properties [name : string pointlist : pointlist orientation : orientation])
vx/ui/flow
Description:
Package Name:
  • vx/ui/flow
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
Types:
Constants:
Functions:
Source Code:
  • (package vx/ui/flow)
vx/ui/image
Description:
Package Name:
  • vx/ui/image
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
Types:
Constants:
Functions:
Source Code:
  • (package vx/ui/image)
vx/ui/navigation
Description:
Package Name:
  • vx/ui/navigation
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
Types:
Constants:
Functions:
Source Code:
  • (package vx/ui/navigation)
vx/ui/scrollbar
Description:
Package Name:
  • vx/ui/scrollbar
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
Types:
Constants:
Functions:
Source Code:
  • (package vx/ui/scrollbar)
vx/ui/text
Description:
Package Name:
  • vx/ui/text
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
Types:
Constants:
Functions:
Source Code:
  • (package vx/ui/text)
vx/ui/textentry
Description:
Package Name:
  • vx/ui/textentry
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
Types:
Constants:
Functions:
Source Code:
  • (package vx/ui/textentry)
vx/ui/ui
Description:
  • Universal Ui Element
Package Name:
  • vx/ui/ui
Libraries:
  • Name
    Path
    vx/core
    vx/core
    vx/test
    vx/test
Types:
  • layout, ui, uimap, uistyle
Constants:
  • layout-app, layout-background, layout-navigation, layout-split-horizontal, layout-split-vertical
Functions:
  • any-render<-ui, anymap-render<-uimap
Source Code:
  • (package vx/ui/ui :doc "Universal Ui Element") (type layout : struct :doc "Universal Layout") (type ui : struct :properties [datamap : anymap rendered : any render-fn : any-render<-ui uimap : uimap uistyle : uistyle] :doc "Universal UI Element") (const layout-app : layout) (const layout-background : layout) (const layout-navigation : layout) (const layout-split-horizontal : layout) (const layout-split-vertical : layout) (type uimap : map :allowtypes [ui]) (type uistyle : struct :properties [layout : layout]) (func any-render<-ui : any [ui : ui] :sideeffects "Alters UI" :doc "Returns a rendered object from a UI Element.") (func anymap-render<-uimap : boolean [uimap : uimap] :sideeffects "Alters UI" :doc "Renders a uimap and returns the map of rendered elements.")
vx/ui/ui / layout
Description:
  • Universal Layout
Type Name:
  • layout
Extends:
  • :struct
Default:
Usage/Test Cases:
Source Code:
  • (type layout : struct :doc "Universal Layout")
vx/ui/ui / ui
Description:
  • Universal UI Element
Type Name:
  • ui
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    datamap
    vx/core/anymap
    false
    false
    rendered
    vx/core/any
    false
    false
    render-fn
    vx/ui/ui/any-render<-ui
    false
    false
    uimap
    vx/ui/ui/uimap
    false
    false
    uistyle
    vx/ui/ui/uistyle
    false
    false
Usage/Test Cases:
Source Code:
  • (type ui : struct :properties [datamap : anymap rendered : any render-fn : any-render<-ui uimap : uimap uistyle : uistyle] :doc "Universal UI Element")
vx/ui/ui / uimap
Description:
Type Name:
  • uimap
Extends:
  • :map
Default:
Allowed Types:
  • ui
Usage/Test Cases:
Source Code:
  • (type uimap : map :allowtypes [ui])
vx/ui/ui / uistyle
Description:
Type Name:
  • uistyle
Extends:
  • :struct
Default:
Properties:
  • Name
    Type
    Description
    Is Multi
    Is Default
    layout
    vx/ui/ui/layout
    false
    false
Usage/Test Cases:
Source Code:
  • (type uistyle : struct :properties [layout : layout])
vx/ui/ui / layout-app
Description:
Constant Name:
  • layout-app
Type:
  • vx/ui/ui/layout
Usage/Test Cases:
Source Code:
  • (const layout-app : layout)
vx/ui/ui / layout-background
Description:
Constant Name:
  • layout-background
Type:
  • vx/ui/ui/layout
Usage/Test Cases:
Source Code:
  • (const layout-background : layout)
vx/ui/ui / layout-navigation
Description:
Constant Name:
  • layout-navigation
Type:
  • vx/ui/ui/layout
Usage/Test Cases:
Source Code:
  • (const layout-navigation : layout)
vx/ui/ui / layout-split-horizontal
Description:
Constant Name:
  • layout-split-horizontal
Type:
  • vx/ui/ui/layout
Usage/Test Cases:
Source Code:
  • (const layout-split-horizontal : layout)
vx/ui/ui / layout-split-vertical
Description:
Constant Name:
  • layout-split-vertical
Type:
  • vx/ui/ui/layout
Usage/Test Cases:
Source Code:
  • (const layout-split-vertical : layout)
vx/ui/ui / any-render<-ui
Description:
  • Returns a rendered object from a UI Element.
Function Name:
  • any-render<-ui
Return Type:
  • vx/core/any
Arguments:
  • Name
    Type
    Generic
    Description
    ui
    vx/ui/ui/ui
Usage/Test Cases:
Source Code:
  • (func any-render<-ui : any [ui : ui] :sideeffects "Alters UI" :doc "Returns a rendered object from a UI Element.")
vx/ui/ui / anymap-render<-uimap
Description:
  • Renders a uimap and returns the map of rendered elements.
Function Name:
  • anymap-render<-uimap
Return Type:
  • vx/core/boolean
Arguments:
  • Name
    Type
    Generic
    Description
    uimap
    vx/ui/ui/uimap
Usage/Test Cases:
Source Code:
  • (func anymap-render<-uimap : boolean [uimap : uimap] :sideeffects "Alters UI" :doc "Renders a uimap and returns the map of rendered elements.")